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