@spiracss/stylelint-plugin 0.2.2 → 0.3.1

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 +117 -34
  3. package/dist/cjs/helpers.d.ts.map +1 -1
  4. package/dist/cjs/helpers.js +297 -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 +123 -44
  130. package/dist/cjs/rules/spiracss-rel-comments.js.map +1 -1
  131. package/dist/cjs/rules/spiracss-rel-comments.messages.d.ts +6 -5
  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 +84 -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 +32 -16
  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 +117 -34
  197. package/dist/esm/helpers.d.ts.map +1 -1
  198. package/dist/esm/helpers.js +297 -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 +127 -48
  324. package/dist/esm/rules/spiracss-rel-comments.js.map +1 -1
  325. package/dist/esm/rules/spiracss-rel-comments.messages.d.ts +6 -5
  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 +86 -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 +32 -16
  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
@@ -0,0 +1,640 @@
1
+ import stylelint from 'stylelint';
2
+ import { NON_SELECTOR_AT_RULE_NAMES, ROOT_WRAPPER_NAMES } from '../utils/constants.js';
3
+ import { normalizeCustomPattern } from '../utils/naming.js';
4
+ import { selectorParseFailedArgs } from '../utils/messages.js';
5
+ import { getLowercasePolicyKeys } from '../utils/selector-policy.js';
6
+ import { CACHE_SCHEMA, COMMENTS_SCHEMA, EXTERNAL_SCHEMA, NAMING_SCHEMA, POLICY_SCHEMA } from '../utils/option-schema.js';
7
+ import { findParentRule, isAtRule, isRule } from '../utils/postcss-helpers.js';
8
+ import { isRuleInsideAtRule, markInteractionContainers } from '../utils/section.js';
9
+ import { createSelectorCacheWithErrorFlag } from '../utils/selector.js';
10
+ import { createPlugin, createRule, reportInvalidOption, validateOptionsArrayFields } from '../utils/stylelint.js';
11
+ import { getRuleDocsUrl } from '../utils/rule-docs.js';
12
+ import { isBoolean, isNumber, isPlainObject, isString, isStringArray } from '../utils/validate.js';
13
+ import { buildPatterns } from './spiracss-class-structure.patterns.js';
14
+ import { collectRootBlockNames } from './spiracss-class-structure.selectors.js';
15
+ import { isRootBlockRule } from './spiracss-class-structure.sections.js';
16
+ import { ruleName } from './spiracss-property-placement.constants.js';
17
+ import { messages } from './spiracss-property-placement.messages.js';
18
+ import { normalizeOptions } from './spiracss-property-placement.options.js';
19
+ import { analyzeSelectorList, isGlobalOnlySelector, buildPolicySets, normalizeScopePrelude, normalizeUnverifiedScopePrelude, parseMixinName, resolveSelectors, stripGlobalSelectorForRoot, splitSelectors } from './spiracss-property-placement.selectors.js';
20
+ import { createValueTokenHelpers } from './spiracss-property-placement.values.js';
21
+ export { ruleName };
22
+ const meta = {
23
+ url: getRuleDocsUrl(ruleName),
24
+ fixable: false,
25
+ description: 'Enforce SpiraCSS property placement rules (container/item/internal).',
26
+ category: 'stylistic'
27
+ };
28
+ const optionSchema = {
29
+ elementDepth: [isNumber],
30
+ marginSide: [isString],
31
+ position: [isBoolean],
32
+ sizeInternal: [isBoolean],
33
+ responsiveMixins: [isString],
34
+ ...NAMING_SCHEMA,
35
+ ...COMMENTS_SCHEMA,
36
+ ...POLICY_SCHEMA,
37
+ ...EXTERNAL_SCHEMA,
38
+ ...CACHE_SCHEMA
39
+ };
40
+ const CONTAINER_PROP_NAMES = new Set([
41
+ 'flex-direction',
42
+ 'flex-wrap',
43
+ 'gap',
44
+ 'row-gap',
45
+ 'column-gap',
46
+ 'justify-content',
47
+ 'justify-items',
48
+ 'align-content',
49
+ 'align-items'
50
+ ]);
51
+ const ITEM_PROP_NAMES = new Set([
52
+ 'margin',
53
+ 'margin-top',
54
+ 'margin-bottom',
55
+ 'margin-left',
56
+ 'margin-right',
57
+ 'margin-inline',
58
+ 'margin-inline-start',
59
+ 'margin-inline-end',
60
+ 'margin-block',
61
+ 'margin-block-start',
62
+ 'margin-block-end',
63
+ 'flex',
64
+ 'flex-grow',
65
+ 'flex-shrink',
66
+ 'flex-basis',
67
+ 'order',
68
+ 'align-self',
69
+ 'justify-self',
70
+ 'grid-column',
71
+ 'grid-row',
72
+ 'grid-area'
73
+ ]);
74
+ const MARGIN_SIDE_PROP_NAMES = new Set([
75
+ 'margin',
76
+ 'margin-top',
77
+ 'margin-bottom',
78
+ 'margin-block',
79
+ 'margin-block-start',
80
+ 'margin-block-end'
81
+ ]);
82
+ const DISPLAY_ALLOWED = new Set(['flex', 'inline-flex', 'grid', 'inline-grid']);
83
+ const OVERFLOW_PROP_NAMES = new Set(['overflow', 'overflow-x', 'overflow-y']);
84
+ const OFFSET_PROP_NAMES = new Set([
85
+ 'top',
86
+ 'right',
87
+ 'bottom',
88
+ 'left',
89
+ 'inset',
90
+ 'inset-block',
91
+ 'inset-inline',
92
+ 'inset-block-start',
93
+ 'inset-block-end',
94
+ 'inset-inline-start',
95
+ 'inset-inline-end'
96
+ ]);
97
+ const isPaddingProp = (prop) => prop === 'padding' || prop.startsWith('padding-');
98
+ const isContainerProp = (decl) => {
99
+ const prop = decl.prop.toLowerCase();
100
+ if (prop === 'display') {
101
+ const tokens = decl.value
102
+ .trim()
103
+ .toLowerCase()
104
+ .split(/\s+|!/)
105
+ .filter((token) => token.length > 0 && token !== 'important');
106
+ return tokens.some((token) => DISPLAY_ALLOWED.has(token));
107
+ }
108
+ if (prop === 'grid')
109
+ return true;
110
+ if (prop === 'grid-template' || prop.startsWith('grid-template-'))
111
+ return true;
112
+ if (prop.startsWith('grid-auto-'))
113
+ return true;
114
+ return CONTAINER_PROP_NAMES.has(prop);
115
+ };
116
+ const isItemProp = (prop) => ITEM_PROP_NAMES.has(prop);
117
+ const isMarginSideProp = (prop) => MARGIN_SIDE_PROP_NAMES.has(prop);
118
+ const isOverflowProp = (prop) => OVERFLOW_PROP_NAMES.has(prop);
119
+ const isSizeInternalProp = (prop) => prop === 'width' ||
120
+ prop === 'height' ||
121
+ prop === 'inline-size' ||
122
+ prop === 'block-size' ||
123
+ prop.startsWith('min-') ||
124
+ prop.startsWith('max-');
125
+ const isInternalProp = (prop, enableSizeInternal) => isPaddingProp(prop) ||
126
+ isOverflowProp(prop) ||
127
+ (enableSizeInternal && isSizeInternalProp(prop));
128
+ const isInsideAtRoot = (node) => {
129
+ let current = node.parent ?? undefined;
130
+ while (current) {
131
+ if (isAtRule(current) && current.name === 'at-root')
132
+ return true;
133
+ current = current.parent ?? undefined;
134
+ }
135
+ return false;
136
+ };
137
+ const rule = createRule(ruleName, messages, (primaryOption, secondaryOption, _context) => {
138
+ if (primaryOption === false) {
139
+ return () => {
140
+ /* rule disabled */
141
+ };
142
+ }
143
+ const rawOptions = typeof primaryOption === 'object' && primaryOption !== null
144
+ ? primaryOption
145
+ : secondaryOption;
146
+ let cache = null;
147
+ const getCache = (reportInvalid) => {
148
+ if (cache)
149
+ return cache;
150
+ let hasInvalidOptions = false;
151
+ const handleInvalid = reportInvalid
152
+ ? (optionName, value, detail) => {
153
+ hasInvalidOptions = true;
154
+ reportInvalid(optionName, value, detail);
155
+ }
156
+ : undefined;
157
+ const options = normalizeOptions(rawOptions, handleInvalid);
158
+ const classifyOptions = {
159
+ external: options.external,
160
+ naming: options.naming
161
+ };
162
+ const customModifierPattern = normalizeCustomPattern(options.naming?.customPatterns?.modifier, 'naming.customPatterns.modifier');
163
+ cache = {
164
+ options,
165
+ patterns: buildPatterns(classifyOptions, options.cache, handleInvalid),
166
+ policySets: buildPolicySets(options.selectorPolicy),
167
+ classifyOptions,
168
+ customModifierPattern,
169
+ hasInvalidOptions
170
+ };
171
+ return cache;
172
+ };
173
+ return (root, result) => {
174
+ const shouldValidate = result.stylelint?.config?.validate !== false;
175
+ if (shouldValidate) {
176
+ const validOptions = stylelint.utils.validateOptions(result, ruleName, {
177
+ actual: primaryOption,
178
+ possible: [true, isPlainObject]
179
+ }, {
180
+ actual: secondaryOption,
181
+ possible: isPlainObject,
182
+ optional: true
183
+ }, {
184
+ actual: rawOptions,
185
+ possible: optionSchema,
186
+ optional: true
187
+ });
188
+ if (!validOptions)
189
+ return;
190
+ }
191
+ const reportInvalid = shouldValidate
192
+ ? (optionName, value, detail) => {
193
+ reportInvalidOption(result, ruleName, optionName, value, detail);
194
+ }
195
+ : undefined;
196
+ const hasInvalid = validateOptionsArrayFields(rawOptions, ['external.classes', 'external.prefixes', 'responsiveMixins'], isStringArray, reportInvalid, (optionName) => `[spiracss] ${optionName} must be an array of non-empty strings.`);
197
+ if (shouldValidate && hasInvalid)
198
+ return;
199
+ const { options, patterns, policySets, classifyOptions, customModifierPattern, hasInvalidOptions } = getCache(reportInvalid);
200
+ if (shouldValidate && hasInvalidOptions)
201
+ return;
202
+ const cacheSizes = options.cache;
203
+ const selectorState = createSelectorCacheWithErrorFlag(cacheSizes.selector);
204
+ const selectorCache = selectorState.cache;
205
+ const resolvedSelectorsCache = new WeakMap();
206
+ const ruleAnalysisCache = new WeakMap();
207
+ const globalOnlyRuleCache = new WeakMap();
208
+ const ruleFamilyKeysCache = new WeakMap();
209
+ const wrapperKeyCache = new WeakMap();
210
+ const atRuleIds = new WeakMap();
211
+ let atRuleIdSeed = 0;
212
+ let firstRule = null;
213
+ const responsiveMixins = new Set(options.responsive.mixins.map((name) => name.toLowerCase()));
214
+ const { checkMarginSide, parsePositionValue, isZeroMinSize } = createValueTokenHelpers();
215
+ const selectorPolicy = options.selectorPolicy;
216
+ const variantMode = selectorPolicy.variant.mode;
217
+ const stateMode = selectorPolicy.state.mode;
218
+ // Display lowercase keys in messages to match actual selector matching behavior.
219
+ const { variantKeys, stateKeys } = getLowercasePolicyKeys(selectorPolicy);
220
+ const naming = options.naming ?? {};
221
+ const modifierPrefix = naming.modifierPrefix ?? '-';
222
+ const modifierCase = naming.modifierCase ?? 'kebab';
223
+ const modifierPattern = customModifierPattern ?? '';
224
+ const getAtRuleId = (atRule) => {
225
+ const cached = atRuleIds.get(atRule);
226
+ if (cached)
227
+ return cached;
228
+ atRuleIdSeed += 1;
229
+ atRuleIds.set(atRule, atRuleIdSeed);
230
+ return atRuleIdSeed;
231
+ };
232
+ const rootBlockRules = new WeakSet();
233
+ const declsByRule = new Map();
234
+ root.walk((node) => {
235
+ if (node.type === 'rule') {
236
+ const rule = node;
237
+ if (!firstRule)
238
+ firstRule = rule;
239
+ if (isRuleInsideAtRule(rule, NON_SELECTOR_AT_RULE_NAMES))
240
+ return;
241
+ if (findParentRule(rule))
242
+ return;
243
+ if (!isRootBlockRule(rule))
244
+ return;
245
+ if (typeof rule.selector !== 'string')
246
+ return;
247
+ const selectorTexts = splitSelectors(rule.selector, selectorCache);
248
+ // Root block detection strips :global parts while preserving leading combinators.
249
+ const localSelectors = selectorTexts
250
+ .map((selector) => stripGlobalSelectorForRoot(selector, selectorCache, options.cache.selector, {
251
+ preserveCombinator: true
252
+ }))
253
+ .filter((selector) => Boolean(selector));
254
+ if (localSelectors.length === 0)
255
+ return;
256
+ const selectors = localSelectors.flatMap((selector) => selectorCache.parse(selector));
257
+ const rootBlocks = collectRootBlockNames(selectors, classifyOptions, patterns);
258
+ if (rootBlocks.length === 0)
259
+ return;
260
+ rootBlockRules.add(rule);
261
+ return;
262
+ }
263
+ if (node.type === 'decl') {
264
+ const decl = node;
265
+ const parentRule = findParentRule(decl);
266
+ if (!parentRule)
267
+ return;
268
+ const bucket = declsByRule.get(parentRule);
269
+ if (bucket) {
270
+ bucket.push(decl);
271
+ }
272
+ else {
273
+ declsByRule.set(parentRule, [decl]);
274
+ }
275
+ return;
276
+ }
277
+ });
278
+ const commentPatterns = {
279
+ sharedCommentPattern: options.comments.shared,
280
+ interactionCommentPattern: options.comments.interaction
281
+ };
282
+ const interactionContainers = markInteractionContainers(root, commentPatterns, (_comment, parent) => isRule(parent) && rootBlockRules.has(parent));
283
+ const selectorExplosion = { example: null, limit: 0 };
284
+ const reportSelectorExplosion = (selector, limit) => {
285
+ if (!selectorExplosion.example)
286
+ selectorExplosion.example = selector;
287
+ selectorExplosion.limit = limit;
288
+ };
289
+ const getResolvedSelectors = (rule) => resolveSelectors(rule, selectorCache, resolvedSelectorsCache, reportSelectorExplosion);
290
+ const resolveContextSelector = (rule) => {
291
+ if (!rule || typeof rule.selector !== 'string')
292
+ return '(unknown)';
293
+ const resolved = getResolvedSelectors(rule);
294
+ if (resolved.length > 0)
295
+ return resolved.join(', ');
296
+ return rule.selector;
297
+ };
298
+ const isGlobalOnlyRule = (rule) => {
299
+ const cached = globalOnlyRuleCache.get(rule);
300
+ if (cached !== undefined)
301
+ return cached;
302
+ // If a rule has no non-:global selectors, treat it as out-of-scope for enforcement.
303
+ const resolved = getResolvedSelectors(rule);
304
+ const value = resolved.length > 0 &&
305
+ resolved.every((selector) => isGlobalOnlySelector(selector, selectorCache, options.cache.selector));
306
+ globalOnlyRuleCache.set(rule, value);
307
+ return value;
308
+ };
309
+ const getRuleAnalysis = (rule) => {
310
+ const cached = ruleAnalysisCache.get(rule);
311
+ if (cached)
312
+ return cached;
313
+ const resolvedSelectors = getResolvedSelectors(rule);
314
+ const analysis = resolvedSelectors.length === 0
315
+ ? { status: 'skip' }
316
+ : analyzeSelectorList(resolvedSelectors, selectorCache, options, policySets, patterns, classifyOptions);
317
+ const entry = {
318
+ resolvedSelectors,
319
+ analysis,
320
+ resolvedSelectorText: resolvedSelectors.join(', ')
321
+ };
322
+ ruleAnalysisCache.set(rule, entry);
323
+ return entry;
324
+ };
325
+ const getRuleFamilyKeys = (rule) => {
326
+ if (ruleFamilyKeysCache.has(rule)) {
327
+ return ruleFamilyKeysCache.get(rule) ?? null;
328
+ }
329
+ const { analysis } = getRuleAnalysis(rule);
330
+ if (analysis.status !== 'ok') {
331
+ ruleFamilyKeysCache.set(rule, null);
332
+ return null;
333
+ }
334
+ const keys = analysis.familyKeys;
335
+ if (keys.length === 0) {
336
+ ruleFamilyKeysCache.set(rule, null);
337
+ return null;
338
+ }
339
+ ruleFamilyKeysCache.set(rule, keys);
340
+ return keys;
341
+ };
342
+ const getWrapperContextKey = (node) => {
343
+ const cached = wrapperKeyCache.get(node);
344
+ if (cached)
345
+ return cached;
346
+ const parts = [];
347
+ let current = node.parent ?? undefined;
348
+ while (current) {
349
+ if (isAtRule(current)) {
350
+ const name = current.name ? current.name.toLowerCase() : '';
351
+ if (name === 'scope') {
352
+ const params = typeof current.params === 'string' ? current.params : '';
353
+ const normalized = normalizeScopePrelude(params);
354
+ if (normalized) {
355
+ parts.push(`scope:${normalized}`);
356
+ }
357
+ else {
358
+ const fallback = normalizeUnverifiedScopePrelude(params);
359
+ parts.push(`scope:unverified:${fallback ?? getAtRuleId(current)}`);
360
+ }
361
+ }
362
+ else if (ROOT_WRAPPER_NAMES.has(name)) {
363
+ // allowed wrapper
364
+ }
365
+ else if (name === 'include') {
366
+ const params = typeof current.params === 'string' ? current.params : '';
367
+ const mixinName = parseMixinName(params);
368
+ const allowlisted = mixinName
369
+ ? responsiveMixins.has(mixinName.toLowerCase())
370
+ : false;
371
+ if (!allowlisted) {
372
+ parts.push(`include:${getAtRuleId(current)}`);
373
+ }
374
+ }
375
+ else {
376
+ const keyName = name || 'unknown';
377
+ parts.push(`atrule:${keyName}:${getAtRuleId(current)}`);
378
+ }
379
+ }
380
+ current = current.parent ?? undefined;
381
+ }
382
+ let key = 'ctx:root';
383
+ if (parts.length > 0) {
384
+ let context = '';
385
+ for (let i = parts.length - 1; i >= 0; i -= 1) {
386
+ context += `${context ? '|' : ''}${parts[i]}`;
387
+ }
388
+ key = `ctx:${context}`;
389
+ }
390
+ wrapperKeyCache.set(node, key);
391
+ return key;
392
+ };
393
+ const familyOffsetMap = new Map();
394
+ if (options.position) {
395
+ for (const [rule, decls] of declsByRule) {
396
+ if (interactionContainers.has(rule))
397
+ continue;
398
+ if (isRuleInsideAtRule(rule, NON_SELECTOR_AT_RULE_NAMES))
399
+ continue;
400
+ const familyKeys = getRuleFamilyKeys(rule);
401
+ if (!familyKeys)
402
+ continue;
403
+ const ruleWrapperKey = getWrapperContextKey(rule);
404
+ for (const decl of decls) {
405
+ if (isInsideAtRoot(decl))
406
+ continue;
407
+ const prop = decl.prop.toLowerCase();
408
+ if (!OFFSET_PROP_NAMES.has(prop))
409
+ continue;
410
+ const wrapperKey = decl.parent === rule ? ruleWrapperKey : getWrapperContextKey(decl);
411
+ familyKeys.forEach((key) => {
412
+ familyOffsetMap.set(`${wrapperKey}::${key}`, true);
413
+ });
414
+ }
415
+ }
416
+ }
417
+ root.walkAtRules((atRule) => {
418
+ const name = atRule.name ? atRule.name.toLowerCase() : '';
419
+ const parentRule = findParentRule(atRule);
420
+ if (parentRule && isGlobalOnlyRule(parentRule))
421
+ return;
422
+ if (name === 'extend') {
423
+ const placeholder = atRule.params?.trim() || '%unknown';
424
+ const parentSelector = resolveContextSelector(parentRule);
425
+ stylelint.utils.report({
426
+ ruleName,
427
+ result,
428
+ node: atRule,
429
+ message: messages.forbiddenExtend(parentSelector, placeholder)
430
+ });
431
+ return;
432
+ }
433
+ if (name === 'at-root') {
434
+ if (interactionContainers.has(atRule))
435
+ return;
436
+ const parentSelector = resolveContextSelector(parentRule);
437
+ stylelint.utils.report({
438
+ ruleName,
439
+ result,
440
+ node: atRule,
441
+ message: messages.forbiddenAtRoot(parentSelector, options.comments.interaction)
442
+ });
443
+ }
444
+ });
445
+ for (const [rule, decls] of declsByRule) {
446
+ if (isRuleInsideAtRule(rule, NON_SELECTOR_AT_RULE_NAMES))
447
+ continue;
448
+ if (interactionContainers.has(rule))
449
+ continue;
450
+ if (isInsideAtRoot(rule))
451
+ continue;
452
+ if (typeof rule.selector !== 'string')
453
+ continue;
454
+ const { analysis, resolvedSelectorText } = getRuleAnalysis(rule);
455
+ if (analysis.status === 'skip')
456
+ continue;
457
+ if (analysis.status === 'error') {
458
+ stylelint.utils.report({
459
+ ruleName,
460
+ result,
461
+ node: rule,
462
+ message: analysis.message
463
+ });
464
+ continue;
465
+ }
466
+ const selectorInfos = analysis.selectors;
467
+ const resolvedSelector = resolvedSelectorText;
468
+ const ruleWrapperKey = getWrapperContextKey(rule);
469
+ decls.forEach((decl) => {
470
+ if (isInsideAtRoot(decl))
471
+ return;
472
+ const prop = decl.prop.toLowerCase();
473
+ if (!prop || prop.startsWith('--'))
474
+ return;
475
+ if (isContainerProp(decl)) {
476
+ const hasPageRoot = selectorInfos.some((info) => info.kind === 'page-root');
477
+ if (hasPageRoot) {
478
+ stylelint.utils.report({
479
+ ruleName,
480
+ result,
481
+ node: decl,
482
+ message: messages.pageRootContainer(prop, resolvedSelector)
483
+ });
484
+ return;
485
+ }
486
+ const hasChildBlock = selectorInfos.some((info) => info.kind === 'child-block');
487
+ if (!hasChildBlock)
488
+ return;
489
+ stylelint.utils.report({
490
+ ruleName,
491
+ result,
492
+ node: decl,
493
+ message: messages.containerInChildBlock(prop, resolvedSelector)
494
+ });
495
+ return;
496
+ }
497
+ if (isItemProp(prop)) {
498
+ const hasPageRoot = selectorInfos.some((info) => info.kind === 'page-root');
499
+ if (hasPageRoot) {
500
+ stylelint.utils.report({
501
+ ruleName,
502
+ result,
503
+ node: decl,
504
+ message: messages.pageRootItem(prop, resolvedSelector)
505
+ });
506
+ return;
507
+ }
508
+ const hasInvalidPlacement = selectorInfos.some((info) => {
509
+ if (info.kind === 'root')
510
+ return true;
511
+ return info.tailCombinator === null;
512
+ });
513
+ if (hasInvalidPlacement) {
514
+ stylelint.utils.report({
515
+ ruleName,
516
+ result,
517
+ node: decl,
518
+ message: messages.itemInRoot(prop, resolvedSelector)
519
+ });
520
+ return;
521
+ }
522
+ if (isMarginSideProp(prop)) {
523
+ const marginSideResult = checkMarginSide(prop, decl.value, options.margin.side);
524
+ if (marginSideResult === 'error') {
525
+ const disallowedSide = options.margin.side === 'top' ? 'bottom' : 'top';
526
+ stylelint.utils.report({
527
+ ruleName,
528
+ result,
529
+ node: decl,
530
+ message: messages.marginSideViolation(prop, resolvedSelector, disallowedSide)
531
+ });
532
+ }
533
+ }
534
+ return;
535
+ }
536
+ if (isInternalProp(prop, options.size.internal)) {
537
+ // Allow min-* = 0 everywhere (self/item-side exception) before internal checks.
538
+ if (options.size.internal && isZeroMinSize(prop, decl.value))
539
+ return;
540
+ const hasPageRoot = selectorInfos.some((info) => info.kind === 'page-root');
541
+ if (hasPageRoot) {
542
+ stylelint.utils.report({
543
+ ruleName,
544
+ result,
545
+ node: decl,
546
+ message: messages.pageRootInternal(prop, resolvedSelector)
547
+ });
548
+ return;
549
+ }
550
+ const hasChildBlock = selectorInfos.some((info) => info.kind === 'child-block');
551
+ if (!hasChildBlock)
552
+ return;
553
+ stylelint.utils.report({
554
+ ruleName,
555
+ result,
556
+ node: decl,
557
+ message: messages.internalInChildBlock(prop, resolvedSelector, variantMode, variantKeys, stateMode, stateKeys, modifierPrefix, modifierCase, modifierPattern)
558
+ });
559
+ return;
560
+ }
561
+ if (options.position && prop === 'position') {
562
+ const hasChildBlock = selectorInfos.some((info) => info.kind === 'child-block');
563
+ if (!hasChildBlock)
564
+ return;
565
+ const parsedPosition = parsePositionValue(decl.value);
566
+ if (parsedPosition.status === 'skip')
567
+ return;
568
+ if (parsedPosition.status === 'unknown') {
569
+ stylelint.utils.report({
570
+ ruleName,
571
+ result,
572
+ node: decl,
573
+ message: messages.positionInChildBlock(parsedPosition.value, resolvedSelector, options.responsive.mixins, parsedPosition.reason)
574
+ });
575
+ return;
576
+ }
577
+ if (parsedPosition.value === 'static')
578
+ return;
579
+ if (parsedPosition.value === 'fixed' || parsedPosition.value === 'sticky') {
580
+ stylelint.utils.report({
581
+ ruleName,
582
+ result,
583
+ node: decl,
584
+ message: messages.positionInChildBlock(parsedPosition.value, resolvedSelector, options.responsive.mixins)
585
+ });
586
+ return;
587
+ }
588
+ if (parsedPosition.value === 'relative' || parsedPosition.value === 'absolute') {
589
+ if (analysis.hasUnverifiedFamilyKeys) {
590
+ stylelint.utils.report({
591
+ ruleName,
592
+ result,
593
+ node: decl,
594
+ message: messages.positionInChildBlock(parsedPosition.value, resolvedSelector, options.responsive.mixins)
595
+ });
596
+ return;
597
+ }
598
+ const familyKeys = getRuleFamilyKeys(rule);
599
+ if (!familyKeys)
600
+ return;
601
+ const wrapperKey = decl.parent === rule ? ruleWrapperKey : getWrapperContextKey(decl);
602
+ // Require offsets for every selector in a list to avoid partial matches.
603
+ const hasOffsets = familyKeys.every((key) => familyOffsetMap.has(`${wrapperKey}::${key}`));
604
+ if (hasOffsets)
605
+ return;
606
+ stylelint.utils.report({
607
+ ruleName,
608
+ result,
609
+ node: decl,
610
+ message: messages.positionInChildBlock(parsedPosition.value, resolvedSelector, options.responsive.mixins)
611
+ });
612
+ }
613
+ }
614
+ });
615
+ }
616
+ if (selectorState.hasError()) {
617
+ const targetNode = firstRule || root;
618
+ stylelint.utils.report({
619
+ ruleName,
620
+ result,
621
+ node: targetNode,
622
+ message: messages.selectorParseFailed(...selectorParseFailedArgs(selectorState.getErrorSelector())),
623
+ severity: 'warning'
624
+ });
625
+ }
626
+ if (selectorExplosion.example) {
627
+ const targetNode = firstRule || root;
628
+ stylelint.utils.report({
629
+ ruleName,
630
+ result,
631
+ node: targetNode,
632
+ message: messages.selectorResolutionSkipped(selectorExplosion.limit, selectorExplosion.example),
633
+ severity: 'warning'
634
+ });
635
+ }
636
+ };
637
+ }, meta);
638
+ const spiracssPropertyPlacement = createPlugin(ruleName, rule);
639
+ export default spiracssPropertyPlacement;
640
+ //# sourceMappingURL=spiracss-property-placement.js.map