@jesscss/core 2.0.0-alpha.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 (423) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +9 -0
  3. package/lib/context.d.ts +352 -0
  4. package/lib/context.d.ts.map +1 -0
  5. package/lib/context.js +636 -0
  6. package/lib/context.js.map +1 -0
  7. package/lib/conversions.d.ts +73 -0
  8. package/lib/conversions.d.ts.map +1 -0
  9. package/lib/conversions.js +253 -0
  10. package/lib/conversions.js.map +1 -0
  11. package/lib/debug-log.d.ts +2 -0
  12. package/lib/debug-log.d.ts.map +1 -0
  13. package/lib/debug-log.js +27 -0
  14. package/lib/debug-log.js.map +1 -0
  15. package/lib/define-function.d.ts +587 -0
  16. package/lib/define-function.d.ts.map +1 -0
  17. package/lib/define-function.js +726 -0
  18. package/lib/define-function.js.map +1 -0
  19. package/lib/deprecation.d.ts +34 -0
  20. package/lib/deprecation.d.ts.map +1 -0
  21. package/lib/deprecation.js +57 -0
  22. package/lib/deprecation.js.map +1 -0
  23. package/lib/index.d.ts +22 -0
  24. package/lib/index.d.ts.map +1 -0
  25. package/lib/index.js +23 -0
  26. package/lib/index.js.map +1 -0
  27. package/lib/jess-error.d.ts +343 -0
  28. package/lib/jess-error.d.ts.map +1 -0
  29. package/lib/jess-error.js +508 -0
  30. package/lib/jess-error.js.map +1 -0
  31. package/lib/logger/deprecation-processing.d.ts +41 -0
  32. package/lib/logger/deprecation-processing.d.ts.map +1 -0
  33. package/lib/logger/deprecation-processing.js +81 -0
  34. package/lib/logger/deprecation-processing.js.map +1 -0
  35. package/lib/logger.d.ts +10 -0
  36. package/lib/logger.d.ts.map +1 -0
  37. package/lib/logger.js +20 -0
  38. package/lib/logger.js.map +1 -0
  39. package/lib/plugin.d.ts +94 -0
  40. package/lib/plugin.d.ts.map +1 -0
  41. package/lib/plugin.js +174 -0
  42. package/lib/plugin.js.map +1 -0
  43. package/lib/tree/ampersand.d.ts +94 -0
  44. package/lib/tree/ampersand.d.ts.map +1 -0
  45. package/lib/tree/ampersand.js +269 -0
  46. package/lib/tree/ampersand.js.map +1 -0
  47. package/lib/tree/any.d.ts +58 -0
  48. package/lib/tree/any.d.ts.map +1 -0
  49. package/lib/tree/any.js +101 -0
  50. package/lib/tree/any.js.map +1 -0
  51. package/lib/tree/at-rule.d.ts +53 -0
  52. package/lib/tree/at-rule.d.ts.map +1 -0
  53. package/lib/tree/at-rule.js +503 -0
  54. package/lib/tree/at-rule.js.map +1 -0
  55. package/lib/tree/block.d.ts +22 -0
  56. package/lib/tree/block.d.ts.map +1 -0
  57. package/lib/tree/block.js +24 -0
  58. package/lib/tree/block.js.map +1 -0
  59. package/lib/tree/bool.d.ts +17 -0
  60. package/lib/tree/bool.d.ts.map +1 -0
  61. package/lib/tree/bool.js +24 -0
  62. package/lib/tree/bool.js.map +1 -0
  63. package/lib/tree/call.d.ts +66 -0
  64. package/lib/tree/call.d.ts.map +1 -0
  65. package/lib/tree/call.js +306 -0
  66. package/lib/tree/call.js.map +1 -0
  67. package/lib/tree/collection.d.ts +30 -0
  68. package/lib/tree/collection.d.ts.map +1 -0
  69. package/lib/tree/collection.js +37 -0
  70. package/lib/tree/collection.js.map +1 -0
  71. package/lib/tree/color.d.ts +101 -0
  72. package/lib/tree/color.d.ts.map +1 -0
  73. package/lib/tree/color.js +513 -0
  74. package/lib/tree/color.js.map +1 -0
  75. package/lib/tree/combinator.d.ts +12 -0
  76. package/lib/tree/combinator.d.ts.map +1 -0
  77. package/lib/tree/combinator.js +8 -0
  78. package/lib/tree/combinator.js.map +1 -0
  79. package/lib/tree/comment.d.ts +20 -0
  80. package/lib/tree/comment.d.ts.map +1 -0
  81. package/lib/tree/comment.js +18 -0
  82. package/lib/tree/comment.js.map +1 -0
  83. package/lib/tree/condition.d.ts +31 -0
  84. package/lib/tree/condition.d.ts.map +1 -0
  85. package/lib/tree/condition.js +103 -0
  86. package/lib/tree/condition.js.map +1 -0
  87. package/lib/tree/control.d.ts +104 -0
  88. package/lib/tree/control.d.ts.map +1 -0
  89. package/lib/tree/control.js +430 -0
  90. package/lib/tree/control.js.map +1 -0
  91. package/lib/tree/declaration-custom.d.ts +18 -0
  92. package/lib/tree/declaration-custom.d.ts.map +1 -0
  93. package/lib/tree/declaration-custom.js +24 -0
  94. package/lib/tree/declaration-custom.js.map +1 -0
  95. package/lib/tree/declaration-var.d.ts +36 -0
  96. package/lib/tree/declaration-var.d.ts.map +1 -0
  97. package/lib/tree/declaration-var.js +63 -0
  98. package/lib/tree/declaration-var.js.map +1 -0
  99. package/lib/tree/declaration.d.ts +78 -0
  100. package/lib/tree/declaration.d.ts.map +1 -0
  101. package/lib/tree/declaration.js +289 -0
  102. package/lib/tree/declaration.js.map +1 -0
  103. package/lib/tree/default-guard.d.ts +15 -0
  104. package/lib/tree/default-guard.d.ts.map +1 -0
  105. package/lib/tree/default-guard.js +19 -0
  106. package/lib/tree/default-guard.js.map +1 -0
  107. package/lib/tree/dimension.d.ts +33 -0
  108. package/lib/tree/dimension.d.ts.map +1 -0
  109. package/lib/tree/dimension.js +291 -0
  110. package/lib/tree/dimension.js.map +1 -0
  111. package/lib/tree/expression.d.ts +24 -0
  112. package/lib/tree/expression.d.ts.map +1 -0
  113. package/lib/tree/expression.js +28 -0
  114. package/lib/tree/expression.js.map +1 -0
  115. package/lib/tree/extend-list.d.ts +23 -0
  116. package/lib/tree/extend-list.d.ts.map +1 -0
  117. package/lib/tree/extend-list.js +20 -0
  118. package/lib/tree/extend-list.js.map +1 -0
  119. package/lib/tree/extend.d.ts +47 -0
  120. package/lib/tree/extend.d.ts.map +1 -0
  121. package/lib/tree/extend.js +292 -0
  122. package/lib/tree/extend.js.map +1 -0
  123. package/lib/tree/function.d.ts +48 -0
  124. package/lib/tree/function.d.ts.map +1 -0
  125. package/lib/tree/function.js +74 -0
  126. package/lib/tree/function.js.map +1 -0
  127. package/lib/tree/import-js.d.ts +35 -0
  128. package/lib/tree/import-js.d.ts.map +1 -0
  129. package/lib/tree/import-js.js +45 -0
  130. package/lib/tree/import-js.js.map +1 -0
  131. package/lib/tree/import-style.d.ts +156 -0
  132. package/lib/tree/import-style.d.ts.map +1 -0
  133. package/lib/tree/import-style.js +556 -0
  134. package/lib/tree/import-style.js.map +1 -0
  135. package/lib/tree/index.d.ts +71 -0
  136. package/lib/tree/index.d.ts.map +1 -0
  137. package/lib/tree/index.js +95 -0
  138. package/lib/tree/index.js.map +1 -0
  139. package/lib/tree/interpolated-reference.d.ts +24 -0
  140. package/lib/tree/interpolated-reference.d.ts.map +1 -0
  141. package/lib/tree/interpolated-reference.js +37 -0
  142. package/lib/tree/interpolated-reference.js.map +1 -0
  143. package/lib/tree/interpolated.d.ts +62 -0
  144. package/lib/tree/interpolated.d.ts.map +1 -0
  145. package/lib/tree/interpolated.js +204 -0
  146. package/lib/tree/interpolated.js.map +1 -0
  147. package/lib/tree/js-array.d.ts +10 -0
  148. package/lib/tree/js-array.d.ts.map +1 -0
  149. package/lib/tree/js-array.js +10 -0
  150. package/lib/tree/js-array.js.map +1 -0
  151. package/lib/tree/js-expr.d.ts +23 -0
  152. package/lib/tree/js-expr.d.ts.map +1 -0
  153. package/lib/tree/js-expr.js +28 -0
  154. package/lib/tree/js-expr.js.map +1 -0
  155. package/lib/tree/js-function.d.ts +20 -0
  156. package/lib/tree/js-function.d.ts.map +1 -0
  157. package/lib/tree/js-function.js +16 -0
  158. package/lib/tree/js-function.js.map +1 -0
  159. package/lib/tree/js-object.d.ts +10 -0
  160. package/lib/tree/js-object.d.ts.map +1 -0
  161. package/lib/tree/js-object.js +10 -0
  162. package/lib/tree/js-object.js.map +1 -0
  163. package/lib/tree/list.d.ts +38 -0
  164. package/lib/tree/list.d.ts.map +1 -0
  165. package/lib/tree/list.js +83 -0
  166. package/lib/tree/list.js.map +1 -0
  167. package/lib/tree/log.d.ts +29 -0
  168. package/lib/tree/log.d.ts.map +1 -0
  169. package/lib/tree/log.js +56 -0
  170. package/lib/tree/log.js.map +1 -0
  171. package/lib/tree/mixin.d.ts +87 -0
  172. package/lib/tree/mixin.d.ts.map +1 -0
  173. package/lib/tree/mixin.js +112 -0
  174. package/lib/tree/mixin.js.map +1 -0
  175. package/lib/tree/negative.d.ts +17 -0
  176. package/lib/tree/negative.d.ts.map +1 -0
  177. package/lib/tree/negative.js +22 -0
  178. package/lib/tree/negative.js.map +1 -0
  179. package/lib/tree/nil.d.ts +31 -0
  180. package/lib/tree/nil.d.ts.map +1 -0
  181. package/lib/tree/nil.js +36 -0
  182. package/lib/tree/nil.js.map +1 -0
  183. package/lib/tree/node-base.d.ts +359 -0
  184. package/lib/tree/node-base.d.ts.map +1 -0
  185. package/lib/tree/node-base.js +884 -0
  186. package/lib/tree/node-base.js.map +1 -0
  187. package/lib/tree/node.d.ts +10 -0
  188. package/lib/tree/node.d.ts.map +1 -0
  189. package/lib/tree/node.js +45 -0
  190. package/lib/tree/node.js.map +1 -0
  191. package/lib/tree/number.d.ts +21 -0
  192. package/lib/tree/number.d.ts.map +1 -0
  193. package/lib/tree/number.js +27 -0
  194. package/lib/tree/number.js.map +1 -0
  195. package/lib/tree/operation.d.ts +26 -0
  196. package/lib/tree/operation.d.ts.map +1 -0
  197. package/lib/tree/operation.js +103 -0
  198. package/lib/tree/operation.js.map +1 -0
  199. package/lib/tree/paren.d.ts +18 -0
  200. package/lib/tree/paren.d.ts.map +1 -0
  201. package/lib/tree/paren.js +86 -0
  202. package/lib/tree/paren.js.map +1 -0
  203. package/lib/tree/query-condition.d.ts +17 -0
  204. package/lib/tree/query-condition.d.ts.map +1 -0
  205. package/lib/tree/query-condition.js +39 -0
  206. package/lib/tree/query-condition.js.map +1 -0
  207. package/lib/tree/quoted.d.ts +27 -0
  208. package/lib/tree/quoted.d.ts.map +1 -0
  209. package/lib/tree/quoted.js +66 -0
  210. package/lib/tree/quoted.js.map +1 -0
  211. package/lib/tree/range.d.ts +33 -0
  212. package/lib/tree/range.d.ts.map +1 -0
  213. package/lib/tree/range.js +47 -0
  214. package/lib/tree/range.js.map +1 -0
  215. package/lib/tree/reference.d.ts +76 -0
  216. package/lib/tree/reference.d.ts.map +1 -0
  217. package/lib/tree/reference.js +521 -0
  218. package/lib/tree/reference.js.map +1 -0
  219. package/lib/tree/rest.d.ts +15 -0
  220. package/lib/tree/rest.d.ts.map +1 -0
  221. package/lib/tree/rest.js +32 -0
  222. package/lib/tree/rest.js.map +1 -0
  223. package/lib/tree/rules-raw.d.ts +17 -0
  224. package/lib/tree/rules-raw.d.ts.map +1 -0
  225. package/lib/tree/rules-raw.js +37 -0
  226. package/lib/tree/rules-raw.js.map +1 -0
  227. package/lib/tree/rules.d.ts +255 -0
  228. package/lib/tree/rules.d.ts.map +1 -0
  229. package/lib/tree/rules.js +2293 -0
  230. package/lib/tree/rules.js.map +1 -0
  231. package/lib/tree/ruleset.d.ts +91 -0
  232. package/lib/tree/ruleset.d.ts.map +1 -0
  233. package/lib/tree/ruleset.js +506 -0
  234. package/lib/tree/ruleset.js.map +1 -0
  235. package/lib/tree/selector-attr.d.ts +31 -0
  236. package/lib/tree/selector-attr.d.ts.map +1 -0
  237. package/lib/tree/selector-attr.js +99 -0
  238. package/lib/tree/selector-attr.js.map +1 -0
  239. package/lib/tree/selector-basic.d.ts +23 -0
  240. package/lib/tree/selector-basic.d.ts.map +1 -0
  241. package/lib/tree/selector-basic.js +34 -0
  242. package/lib/tree/selector-basic.js.map +1 -0
  243. package/lib/tree/selector-capture.d.ts +23 -0
  244. package/lib/tree/selector-capture.d.ts.map +1 -0
  245. package/lib/tree/selector-capture.js +34 -0
  246. package/lib/tree/selector-capture.js.map +1 -0
  247. package/lib/tree/selector-complex.d.ts +40 -0
  248. package/lib/tree/selector-complex.d.ts.map +1 -0
  249. package/lib/tree/selector-complex.js +143 -0
  250. package/lib/tree/selector-complex.js.map +1 -0
  251. package/lib/tree/selector-compound.d.ts +16 -0
  252. package/lib/tree/selector-compound.d.ts.map +1 -0
  253. package/lib/tree/selector-compound.js +114 -0
  254. package/lib/tree/selector-compound.js.map +1 -0
  255. package/lib/tree/selector-interpolated.d.ts +23 -0
  256. package/lib/tree/selector-interpolated.d.ts.map +1 -0
  257. package/lib/tree/selector-interpolated.js +27 -0
  258. package/lib/tree/selector-interpolated.js.map +1 -0
  259. package/lib/tree/selector-list.d.ts +17 -0
  260. package/lib/tree/selector-list.d.ts.map +1 -0
  261. package/lib/tree/selector-list.js +184 -0
  262. package/lib/tree/selector-list.js.map +1 -0
  263. package/lib/tree/selector-pseudo.d.ts +42 -0
  264. package/lib/tree/selector-pseudo.d.ts.map +1 -0
  265. package/lib/tree/selector-pseudo.js +191 -0
  266. package/lib/tree/selector-pseudo.js.map +1 -0
  267. package/lib/tree/selector-simple.d.ts +5 -0
  268. package/lib/tree/selector-simple.d.ts.map +1 -0
  269. package/lib/tree/selector-simple.js +6 -0
  270. package/lib/tree/selector-simple.js.map +1 -0
  271. package/lib/tree/selector.d.ts +43 -0
  272. package/lib/tree/selector.d.ts.map +1 -0
  273. package/lib/tree/selector.js +56 -0
  274. package/lib/tree/selector.js.map +1 -0
  275. package/lib/tree/sequence.d.ts +43 -0
  276. package/lib/tree/sequence.d.ts.map +1 -0
  277. package/lib/tree/sequence.js +148 -0
  278. package/lib/tree/sequence.js.map +1 -0
  279. package/lib/tree/tree.d.ts +87 -0
  280. package/lib/tree/tree.d.ts.map +1 -0
  281. package/lib/tree/tree.js +2 -0
  282. package/lib/tree/tree.js.map +1 -0
  283. package/lib/tree/url.d.ts +18 -0
  284. package/lib/tree/url.d.ts.map +1 -0
  285. package/lib/tree/url.js +35 -0
  286. package/lib/tree/url.js.map +1 -0
  287. package/lib/tree/util/__tests__/debug-log.d.ts +1 -0
  288. package/lib/tree/util/__tests__/debug-log.d.ts.map +1 -0
  289. package/lib/tree/util/__tests__/debug-log.js +36 -0
  290. package/lib/tree/util/__tests__/debug-log.js.map +1 -0
  291. package/lib/tree/util/calculate.d.ts +3 -0
  292. package/lib/tree/util/calculate.d.ts.map +1 -0
  293. package/lib/tree/util/calculate.js +10 -0
  294. package/lib/tree/util/calculate.js.map +1 -0
  295. package/lib/tree/util/cast.d.ts +10 -0
  296. package/lib/tree/util/cast.d.ts.map +1 -0
  297. package/lib/tree/util/cast.js +87 -0
  298. package/lib/tree/util/cast.js.map +1 -0
  299. package/lib/tree/util/cloning.d.ts +4 -0
  300. package/lib/tree/util/cloning.d.ts.map +1 -0
  301. package/lib/tree/util/cloning.js +8 -0
  302. package/lib/tree/util/cloning.js.map +1 -0
  303. package/lib/tree/util/collections.d.ts +57 -0
  304. package/lib/tree/util/collections.d.ts.map +1 -0
  305. package/lib/tree/util/collections.js +136 -0
  306. package/lib/tree/util/collections.js.map +1 -0
  307. package/lib/tree/util/compare.d.ts +11 -0
  308. package/lib/tree/util/compare.d.ts.map +1 -0
  309. package/lib/tree/util/compare.js +89 -0
  310. package/lib/tree/util/compare.js.map +1 -0
  311. package/lib/tree/util/extend-helpers.d.ts +2 -0
  312. package/lib/tree/util/extend-helpers.d.ts.map +1 -0
  313. package/lib/tree/util/extend-helpers.js +2 -0
  314. package/lib/tree/util/extend-helpers.js.map +1 -0
  315. package/lib/tree/util/extend-roots.d.ts +37 -0
  316. package/lib/tree/util/extend-roots.d.ts.map +1 -0
  317. package/lib/tree/util/extend-roots.js +682 -0
  318. package/lib/tree/util/extend-roots.js.map +1 -0
  319. package/lib/tree/util/extend-roots.old.d.ts +132 -0
  320. package/lib/tree/util/extend-roots.old.d.ts.map +1 -0
  321. package/lib/tree/util/extend-roots.old.js +2272 -0
  322. package/lib/tree/util/extend-roots.old.js.map +1 -0
  323. package/lib/tree/util/extend-trace-debug.d.ts +13 -0
  324. package/lib/tree/util/extend-trace-debug.d.ts.map +1 -0
  325. package/lib/tree/util/extend-trace-debug.js +34 -0
  326. package/lib/tree/util/extend-trace-debug.js.map +1 -0
  327. package/lib/tree/util/extend.d.ts +218 -0
  328. package/lib/tree/util/extend.d.ts.map +1 -0
  329. package/lib/tree/util/extend.js +3033 -0
  330. package/lib/tree/util/extend.js.map +1 -0
  331. package/lib/tree/util/find-extendable-locations.d.ts +2 -0
  332. package/lib/tree/util/find-extendable-locations.d.ts.map +1 -0
  333. package/lib/tree/util/find-extendable-locations.js +2 -0
  334. package/lib/tree/util/find-extendable-locations.js.map +1 -0
  335. package/lib/tree/util/format.d.ts +20 -0
  336. package/lib/tree/util/format.d.ts.map +1 -0
  337. package/lib/tree/util/format.js +67 -0
  338. package/lib/tree/util/format.js.map +1 -0
  339. package/lib/tree/util/is-node.d.ts +13 -0
  340. package/lib/tree/util/is-node.d.ts.map +1 -0
  341. package/lib/tree/util/is-node.js +43 -0
  342. package/lib/tree/util/is-node.js.map +1 -0
  343. package/lib/tree/util/print.d.ts +80 -0
  344. package/lib/tree/util/print.d.ts.map +1 -0
  345. package/lib/tree/util/print.js +205 -0
  346. package/lib/tree/util/print.js.map +1 -0
  347. package/lib/tree/util/process-leading-is.d.ts +25 -0
  348. package/lib/tree/util/process-leading-is.d.ts.map +1 -0
  349. package/lib/tree/util/process-leading-is.js +364 -0
  350. package/lib/tree/util/process-leading-is.js.map +1 -0
  351. package/lib/tree/util/recursion-helper.d.ts +15 -0
  352. package/lib/tree/util/recursion-helper.d.ts.map +1 -0
  353. package/lib/tree/util/recursion-helper.js +43 -0
  354. package/lib/tree/util/recursion-helper.js.map +1 -0
  355. package/lib/tree/util/regex.d.ts +4 -0
  356. package/lib/tree/util/regex.d.ts.map +1 -0
  357. package/lib/tree/util/regex.js +4 -0
  358. package/lib/tree/util/regex.js.map +1 -0
  359. package/lib/tree/util/registry-utils.d.ts +192 -0
  360. package/lib/tree/util/registry-utils.d.ts.map +1 -0
  361. package/lib/tree/util/registry-utils.js +1242 -0
  362. package/lib/tree/util/registry-utils.js.map +1 -0
  363. package/lib/tree/util/ruleset-trace.d.ts +4 -0
  364. package/lib/tree/util/ruleset-trace.d.ts.map +1 -0
  365. package/lib/tree/util/ruleset-trace.js +14 -0
  366. package/lib/tree/util/ruleset-trace.js.map +1 -0
  367. package/lib/tree/util/selector-compare.d.ts +2 -0
  368. package/lib/tree/util/selector-compare.d.ts.map +1 -0
  369. package/lib/tree/util/selector-compare.js +2 -0
  370. package/lib/tree/util/selector-compare.js.map +1 -0
  371. package/lib/tree/util/selector-match-core.d.ts +171 -0
  372. package/lib/tree/util/selector-match-core.d.ts.map +1 -0
  373. package/lib/tree/util/selector-match-core.js +1578 -0
  374. package/lib/tree/util/selector-match-core.js.map +1 -0
  375. package/lib/tree/util/selector-utils.d.ts +30 -0
  376. package/lib/tree/util/selector-utils.d.ts.map +1 -0
  377. package/lib/tree/util/selector-utils.js +100 -0
  378. package/lib/tree/util/selector-utils.js.map +1 -0
  379. package/lib/tree/util/serialize-helper.d.ts +13 -0
  380. package/lib/tree/util/serialize-helper.d.ts.map +1 -0
  381. package/lib/tree/util/serialize-helper.js +387 -0
  382. package/lib/tree/util/serialize-helper.js.map +1 -0
  383. package/lib/tree/util/serialize-types.d.ts +9 -0
  384. package/lib/tree/util/serialize-types.d.ts.map +1 -0
  385. package/lib/tree/util/serialize-types.js +216 -0
  386. package/lib/tree/util/serialize-types.js.map +1 -0
  387. package/lib/tree/util/should-operate.d.ts +23 -0
  388. package/lib/tree/util/should-operate.d.ts.map +1 -0
  389. package/lib/tree/util/should-operate.js +46 -0
  390. package/lib/tree/util/should-operate.js.map +1 -0
  391. package/lib/tree/util/sourcemap.d.ts +7 -0
  392. package/lib/tree/util/sourcemap.d.ts.map +1 -0
  393. package/lib/tree/util/sourcemap.js +25 -0
  394. package/lib/tree/util/sourcemap.js.map +1 -0
  395. package/lib/types/config.d.ts +205 -0
  396. package/lib/types/config.d.ts.map +1 -0
  397. package/lib/types/config.js +2 -0
  398. package/lib/types/config.js.map +1 -0
  399. package/lib/types/index.d.ts +15 -0
  400. package/lib/types/index.d.ts.map +1 -0
  401. package/lib/types/index.js +3 -0
  402. package/lib/types/index.js.map +1 -0
  403. package/lib/types/modes.d.ts +24 -0
  404. package/lib/types/modes.d.ts.map +1 -0
  405. package/lib/types/modes.js +2 -0
  406. package/lib/types/modes.js.map +1 -0
  407. package/lib/types.d.ts +61 -0
  408. package/lib/types.d.ts.map +1 -0
  409. package/lib/types.js +2 -0
  410. package/lib/types.js.map +1 -0
  411. package/lib/use-webpack-resolver.d.ts +9 -0
  412. package/lib/use-webpack-resolver.d.ts.map +1 -0
  413. package/lib/use-webpack-resolver.js +41 -0
  414. package/lib/use-webpack-resolver.js.map +1 -0
  415. package/lib/visitor/index.d.ts +136 -0
  416. package/lib/visitor/index.d.ts.map +1 -0
  417. package/lib/visitor/index.js +135 -0
  418. package/lib/visitor/index.js.map +1 -0
  419. package/lib/visitor/less-visitor.d.ts +7 -0
  420. package/lib/visitor/less-visitor.d.ts.map +1 -0
  421. package/lib/visitor/less-visitor.js +7 -0
  422. package/lib/visitor/less-visitor.js.map +1 -0
  423. package/package.json +66 -0
@@ -0,0 +1,682 @@
1
+ import { WARN, toDiagnostic } from '../../jess-error.js';
2
+ import { Combinator } from '../combinator.js';
3
+ import { ComplexSelector } from '../selector-complex.js';
4
+ import { SelectorList } from '../selector-list.js';
5
+ import { PseudoSelector } from '../selector-pseudo.js';
6
+ import { applyExtendsToSelector } from './extend.js';
7
+ import { findExtendableLocations } from './extend-helpers.js';
8
+ import { isNode } from './is-node.js';
9
+ import { Nil } from '../nil.js';
10
+ import { F_EXTENDED, F_VISIBLE } from '../node.js';
11
+ import { getOptionalRulesetTraceId } from './ruleset-trace.js';
12
+ export class ExtendRootRegistry {
13
+ parentRoot = new WeakMap();
14
+ childrenRoots = new WeakMap();
15
+ layerName = new WeakMap();
16
+ isProtected = new WeakMap();
17
+ isCompose = new WeakMap();
18
+ rootsByLayerName = new Map();
19
+ rootsByNamespace = new Map();
20
+ layerNames = new WeakMap();
21
+ allRoots = new Set();
22
+ root;
23
+ extendRootStack = [];
24
+ getCurrentExtendRoot() {
25
+ return this.extendRootStack[this.extendRootStack.length - 1];
26
+ }
27
+ registerRoot(rules, parent, options) {
28
+ this.allRoots.add(rules);
29
+ if (parent) {
30
+ this.allRoots.add(parent);
31
+ }
32
+ if (!this.root) {
33
+ this.root = rules;
34
+ }
35
+ if (parent) {
36
+ this.parentRoot.set(rules, parent);
37
+ let children = this.childrenRoots.get(parent);
38
+ if (!children) {
39
+ children = new Set();
40
+ this.childrenRoots.set(parent, children);
41
+ }
42
+ children.add(rules);
43
+ }
44
+ if (options?.layerName) {
45
+ this.layerName.set(rules, options.layerName);
46
+ let layerRoots = this.rootsByLayerName.get(options.layerName);
47
+ if (!layerRoots) {
48
+ layerRoots = new Set();
49
+ this.rootsByLayerName.set(options.layerName, layerRoots);
50
+ }
51
+ layerRoots.add(rules);
52
+ }
53
+ if (options?.namespace) {
54
+ let nsRoots = this.rootsByNamespace.get(options.namespace);
55
+ if (!nsRoots) {
56
+ nsRoots = new Set();
57
+ this.rootsByNamespace.set(options.namespace, nsRoots);
58
+ }
59
+ nsRoots.add(rules);
60
+ }
61
+ if (options?.isProtected) {
62
+ this.isProtected.set(rules, true);
63
+ }
64
+ if (options?.isCompose) {
65
+ this.isCompose.set(rules, true);
66
+ }
67
+ }
68
+ pushExtendRoot(rules) {
69
+ this.extendRootStack.push(rules);
70
+ }
71
+ popExtendRoot() {
72
+ this.extendRootStack.pop();
73
+ }
74
+ getVisibleRoots(root) {
75
+ return this.getAccessibleRoots(root);
76
+ }
77
+ getAccessibleRoots(root) {
78
+ const accessible = new Set();
79
+ const visited = new Set();
80
+ const traverseChildren = (currentRoot) => {
81
+ if (visited.has(currentRoot)) {
82
+ return;
83
+ }
84
+ visited.add(currentRoot);
85
+ accessible.add(currentRoot);
86
+ if (this.isProtected.get(currentRoot)) {
87
+ return;
88
+ }
89
+ const children = this.childrenRoots.get(currentRoot);
90
+ if (children) {
91
+ for (const child of children) {
92
+ if (this.isProtected.get(child)) {
93
+ continue;
94
+ }
95
+ traverseChildren(child);
96
+ }
97
+ }
98
+ if (currentRoot.value?.length) {
99
+ for (const node of currentRoot.value) {
100
+ if (node && isNode(node, 'Ruleset') && node.value?.rules && isNode(node.value.rules, 'Rules')) {
101
+ const innerRules = node.value.rules;
102
+ if (!visited.has(innerRules)) {
103
+ accessible.add(innerRules);
104
+ traverseChildren(innerRules);
105
+ }
106
+ }
107
+ else if (node && isNode(node, 'Rules')) {
108
+ const innerRules = node;
109
+ if (!visited.has(innerRules)) {
110
+ accessible.add(innerRules);
111
+ traverseChildren(innerRules);
112
+ }
113
+ }
114
+ }
115
+ }
116
+ const layer = this.layerName.get(currentRoot);
117
+ if (layer) {
118
+ const sameLayerRoots = this.rootsByLayerName.get(layer);
119
+ if (sameLayerRoots) {
120
+ for (const layerRoot of sameLayerRoots) {
121
+ if (layerRoot !== currentRoot && !visited.has(layerRoot) && !this.isProtected.get(layerRoot)) {
122
+ accessible.add(layerRoot);
123
+ traverseChildren(layerRoot);
124
+ }
125
+ }
126
+ }
127
+ }
128
+ };
129
+ traverseChildren(root);
130
+ return accessible;
131
+ }
132
+ isSameOrDescendantRoot(rulesetRoot, extendRoot) {
133
+ if (rulesetRoot === extendRoot) {
134
+ return true;
135
+ }
136
+ if (this.isProtected.get(rulesetRoot)) {
137
+ return false;
138
+ }
139
+ const layerA = this.layerName.get(rulesetRoot);
140
+ const layerB = this.layerName.get(extendRoot);
141
+ if (layerA && layerB && layerA === layerB) {
142
+ return true;
143
+ }
144
+ const children = this.childrenRoots.get(extendRoot);
145
+ if (!children) {
146
+ return false;
147
+ }
148
+ for (const child of children) {
149
+ if (this.isProtected.get(child)) {
150
+ continue;
151
+ }
152
+ if (this.isSameOrDescendantRoot(rulesetRoot, child)) {
153
+ return true;
154
+ }
155
+ }
156
+ return false;
157
+ }
158
+ setLayerName(atRule, layerName) {
159
+ this.layerNames.set(atRule, layerName);
160
+ }
161
+ getLayerName(atRule) {
162
+ return this.layerNames.get(atRule);
163
+ }
164
+ takeLayerName(atRule) {
165
+ const layer = this.layerNames.get(atRule);
166
+ if (layer) {
167
+ this.layerNames.delete(atRule);
168
+ }
169
+ return layer;
170
+ }
171
+ getAllRoots() {
172
+ return new Set(this.allRoots);
173
+ }
174
+ isProtectedRoot(rules) {
175
+ return this.isProtected.get(rules) === true;
176
+ }
177
+ }
178
+ const rulesetsByRoot = new Map();
179
+ function getSourceNodeTraceId(ruleset) {
180
+ const sourceNode = ruleset.sourceNode;
181
+ if (!sourceNode) {
182
+ return null;
183
+ }
184
+ return getOptionalRulesetTraceId(sourceNode) ?? null;
185
+ }
186
+ export function registerRulesetWithRoot(root, ruleset) {
187
+ if (!root || !ruleset) {
188
+ return;
189
+ }
190
+ let set = rulesetsByRoot.get(root);
191
+ if (!set) {
192
+ set = new Set();
193
+ rulesetsByRoot.set(root, set);
194
+ }
195
+ set.add(ruleset);
196
+ const sourceNode = ruleset.sourceNode;
197
+ }
198
+ function isInstructionVisibleForRoot(context, rootRules, instruction) {
199
+ if (!instruction.extendRoot) {
200
+ return false;
201
+ }
202
+ if (instruction.fromReferenceScope === true) {
203
+ // Less parity: extends declared while evaluating a reference import are non-side-effecting.
204
+ return false;
205
+ }
206
+ if (context.extendRoots.isProtectedRoot(rootRules) && instruction.extendRoot !== rootRules) {
207
+ return false;
208
+ }
209
+ if (instruction.extendRoot === rootRules) {
210
+ return true;
211
+ }
212
+ if (context.extendRoots.isSameOrDescendantRoot(rootRules, instruction.extendRoot)) {
213
+ return true;
214
+ }
215
+ const visibleRoots = context.extendRoots.getVisibleRoots(instruction.extendRoot);
216
+ return visibleRoots.has(rootRules);
217
+ }
218
+ function rootHasTargetMatch(root, target, partial) {
219
+ const targetValue = target.valueOf();
220
+ const stack = [...root.value];
221
+ while (stack.length > 0) {
222
+ const node = stack.pop();
223
+ if (!node || typeof node !== 'object') {
224
+ continue;
225
+ }
226
+ if (isNode(node, 'Ruleset')) {
227
+ const selector = node.value.selector;
228
+ if (!selector || isNode(selector, 'Nil')) {
229
+ continue;
230
+ }
231
+ const selectorValue = selector.valueOf();
232
+ if (selectorValue.includes(targetValue)) {
233
+ return true;
234
+ }
235
+ if (findExtendableLocations(selector, target).hasMatches) {
236
+ return true;
237
+ }
238
+ const rules = node.value.rules;
239
+ if (rules && isNode(rules, 'Rules')) {
240
+ stack.push(...rules.value);
241
+ }
242
+ continue;
243
+ }
244
+ if (isNode(node, 'Rules')) {
245
+ stack.push(...node.value);
246
+ continue;
247
+ }
248
+ if (isNode(node, 'AtRule')) {
249
+ const value = node.value;
250
+ if (value && isNode(value, 'Rules')) {
251
+ stack.push(...value.value);
252
+ }
253
+ }
254
+ }
255
+ return false;
256
+ }
257
+ export function processExtends(context) {
258
+ const instructions = context.extends.map(([target, selectorWithExtend, partial, extendRoot, extendNode, , fromReferenceScope]) => ({
259
+ target,
260
+ extendWith: selectorWithExtend,
261
+ partial,
262
+ extendRoot,
263
+ extendNode,
264
+ fromReferenceScope: fromReferenceScope === true
265
+ }));
266
+ if (!instructions.length) {
267
+ return;
268
+ }
269
+ const instructionStats = new Map(instructions.map(i => [i, { visibleMatchCount: 0, blockedMatchCount: 0 }]));
270
+ for (const [rootRules, rulesetSet] of rulesetsByRoot) {
271
+ if (!rootRules) {
272
+ continue;
273
+ }
274
+ const visibleExtendSet = new Set(instructions.filter(instruction => isInstructionVisibleForRoot(context, rootRules, instruction)));
275
+ for (const instruction of instructions) {
276
+ const selectorDiagnostics = [];
277
+ const matchedInRoot = Array.from(rulesetSet).some((ruleset) => {
278
+ const selector = ruleset.value.selector;
279
+ if (!selector || isNode(selector, 'Nil')) {
280
+ return false;
281
+ }
282
+ const locations = findExtendableLocations(selector, instruction.target);
283
+ if (instruction.target.valueOf() === '.base') {
284
+ selectorDiagnostics.push({ selector: selector.valueOf(), hasMatches: locations.hasMatches });
285
+ }
286
+ return locations.hasMatches;
287
+ });
288
+ if (!matchedInRoot) {
289
+ continue;
290
+ }
291
+ const stats = instructionStats.get(instruction);
292
+ if (!stats) {
293
+ continue;
294
+ }
295
+ if (visibleExtendSet.has(instruction)) {
296
+ stats.visibleMatchCount += 1;
297
+ }
298
+ else {
299
+ stats.blockedMatchCount += 1;
300
+ }
301
+ }
302
+ const visibleExtends = Array.from(visibleExtendSet);
303
+ if (!visibleExtends.length) {
304
+ continue;
305
+ }
306
+ const activatingExtends = visibleExtends;
307
+ for (const ruleset of rulesetSet) {
308
+ const selector = ruleset.value.selector;
309
+ if (!selector || isNode(selector, 'Nil')) {
310
+ ruleset.removeFlag(F_EXTENDED);
311
+ continue;
312
+ }
313
+ const isActivatedByVisibleExtend = activatingExtends.some(instruction => (!instruction.partial
314
+ || instruction.target.valueOf() === instruction.extendWith.valueOf())
315
+ && findExtendableLocations(selector, instruction.target).hasMatches);
316
+ if (isActivatedByVisibleExtend) {
317
+ ruleset.addFlag(F_EXTENDED);
318
+ // If a reference-scoped/import-scoped ruleset is externally extended, it must become
319
+ // visible in output so the merged selector can render.
320
+ ruleset.addFlag(F_VISIBLE);
321
+ if (isNode(selector, 'SelectorList')) {
322
+ for (const item of selector.value) {
323
+ item.addFlag(F_EXTENDED);
324
+ item.addFlag(F_VISIBLE);
325
+ }
326
+ }
327
+ else {
328
+ selector.addFlag(F_EXTENDED);
329
+ selector.addFlag(F_VISIBLE);
330
+ }
331
+ }
332
+ else {
333
+ ruleset.removeFlag(F_EXTENDED);
334
+ }
335
+ const ownSelector = ruleset.options?.ownSelector;
336
+ const hasResolvedNestedSelector = Boolean(ownSelector
337
+ && ownSelector.valueOf() !== selector.valueOf());
338
+ const hasOnlyPartialExtends = visibleExtends.length > 0 && visibleExtends.every(instruction => instruction.partial);
339
+ if (ownSelector && hasResolvedNestedSelector && hasOnlyPartialExtends) {
340
+ const ownNewSelector = applyExtendsToSelector(ownSelector, visibleExtends);
341
+ const fullNewSelector = applyExtendsToSelector(selector, visibleExtends);
342
+ const ownBefore = ownSelector.valueOf();
343
+ const ownAfter = ownNewSelector.valueOf();
344
+ const fullBefore = selector.valueOf();
345
+ const fullAfter = fullNewSelector.valueOf();
346
+ if (ownNewSelector !== ownSelector && ownAfter !== ownBefore) {
347
+ ruleset.value.selector = ownNewSelector;
348
+ ruleset.options.ownSelector = ownNewSelector;
349
+ ruleset.invalidateSelectorValueCache();
350
+ if (ownNewSelector.hoistToRoot) {
351
+ ruleset.hoistToRoot = true;
352
+ }
353
+ continue;
354
+ }
355
+ if (fullAfter === fullBefore) {
356
+ continue;
357
+ }
358
+ }
359
+ if (ownSelector && hasResolvedNestedSelector) {
360
+ const partialOnly = visibleExtends.filter(instruction => instruction.partial);
361
+ const nonPartialOnly = visibleExtends.filter(instruction => !instruction.partial);
362
+ if (partialOnly.length > 0 && nonPartialOnly.length === 0) {
363
+ const ownAfterPartialOnly = applyExtendsToSelector(ownSelector, partialOnly);
364
+ const fullAfterPartialOnly = applyExtendsToSelector(selector, partialOnly);
365
+ const ownChangedByPartialOnly = ownAfterPartialOnly.valueOf() !== ownSelector.valueOf();
366
+ const fullChangedByPartialOnly = fullAfterPartialOnly.valueOf() !== selector.valueOf();
367
+ const parentSelector = (ruleset.parent?.parent && isNode(ruleset.parent.parent, 'Ruleset')
368
+ ? ruleset.parent.parent.value.selector
369
+ : null);
370
+ const canDeriveOwnFromGeneratedIs = Boolean(!ownChangedByPartialOnly
371
+ && fullChangedByPartialOnly
372
+ && parentSelector
373
+ && !(parentSelector instanceof Nil)
374
+ && isNode(fullAfterPartialOnly, 'ComplexSelector'));
375
+ if (canDeriveOwnFromGeneratedIs) {
376
+ const complex = fullAfterPartialOnly;
377
+ const last = complex.value.at(-1);
378
+ if (last
379
+ && isNode(last, 'PseudoSelector')
380
+ && last.value.name === ':is'
381
+ && last.value.arg
382
+ && isNode(last.value.arg, 'SelectorList')) {
383
+ const derivedOwn = last.value.arg.copy(true);
384
+ ruleset.value.selector = derivedOwn;
385
+ ruleset.options.ownSelector = derivedOwn;
386
+ ruleset.invalidateSelectorValueCache();
387
+ continue;
388
+ }
389
+ }
390
+ }
391
+ if (partialOnly.length === 0 && nonPartialOnly.length > 0) {
392
+ const parentSelectorForOwnSplit = (ruleset.parent?.parent && isNode(ruleset.parent.parent, 'Ruleset')
393
+ ? ruleset.parent.parent.value.selector
394
+ : null);
395
+ const nonPartialDiagnostics = nonPartialOnly.map((instruction) => {
396
+ const ownAfterSingle = applyExtendsToSelector(ownSelector, [instruction]);
397
+ const fullAfterSingle = applyExtendsToSelector(selector, [instruction]);
398
+ const ownChangedSingle = ownAfterSingle.valueOf() !== ownSelector.valueOf();
399
+ const fullChangedSingle = fullAfterSingle.valueOf() !== selector.valueOf();
400
+ const parentHasTargetMatch = Boolean(parentSelectorForOwnSplit
401
+ && !(parentSelectorForOwnSplit instanceof Nil)
402
+ && findExtendableLocations(parentSelectorForOwnSplit, instruction.target).hasMatches);
403
+ return {
404
+ instruction,
405
+ ownChangedSingle,
406
+ fullChangedSingle,
407
+ parentHasTargetMatch
408
+ };
409
+ });
410
+ const fullChangedExtendWith = new Set(nonPartialDiagnostics
411
+ .filter(d => d.fullChangedSingle)
412
+ .map(d => d.instruction.extendWith.valueOf()));
413
+ const nonPartialWithInclusion = nonPartialDiagnostics.map((d) => {
414
+ const includeOwnOnly = (d.ownChangedSingle
415
+ && !d.fullChangedSingle
416
+ && !d.parentHasTargetMatch
417
+ && !fullChangedExtendWith.has(d.instruction.extendWith.valueOf()));
418
+ return { ...d, includeOwnOnly };
419
+ });
420
+ const nonPartialOwnOnly = nonPartialWithInclusion
421
+ .filter(x => x.includeOwnOnly)
422
+ .map(x => x.instruction);
423
+ const ownAfterOwnOnly = applyExtendsToSelector(ownSelector, nonPartialOwnOnly);
424
+ const hasAncestorDrivenNonPartial = nonPartialWithInclusion.some(d => !d.ownChangedSingle
425
+ && d.fullChangedSingle
426
+ && d.parentHasTargetMatch);
427
+ if (hasAncestorDrivenNonPartial) {
428
+ // Parent already carries this non-partial effect; keep nested selector local.
429
+ ruleset.value.selector = ownAfterOwnOnly;
430
+ ruleset.options.ownSelector = ownAfterOwnOnly;
431
+ ruleset.invalidateSelectorValueCache();
432
+ continue;
433
+ }
434
+ }
435
+ if (partialOnly.length > 0 && nonPartialOnly.length > 0) {
436
+ const parentSelectorForOwnSplit = (ruleset.parent?.parent && isNode(ruleset.parent.parent, 'Ruleset')
437
+ ? ruleset.parent.parent.value.selector
438
+ : null);
439
+ const nonPartialDiagnostics = nonPartialOnly.map((instruction) => {
440
+ const ownAfterSingle = applyExtendsToSelector(ownSelector, [instruction]);
441
+ const fullAfterSingle = applyExtendsToSelector(selector, [instruction]);
442
+ const ownChangedSingle = ownAfterSingle.valueOf() !== ownSelector.valueOf();
443
+ const fullChangedSingle = fullAfterSingle.valueOf() !== selector.valueOf();
444
+ const parentHasTargetMatch = Boolean(parentSelectorForOwnSplit
445
+ && !(parentSelectorForOwnSplit instanceof Nil)
446
+ && findExtendableLocations(parentSelectorForOwnSplit, instruction.target).hasMatches);
447
+ return {
448
+ instruction,
449
+ ownChangedSingle,
450
+ fullChangedSingle,
451
+ parentHasTargetMatch
452
+ };
453
+ });
454
+ const fullChangedExtendWith = new Set(nonPartialDiagnostics
455
+ .filter(d => d.fullChangedSingle)
456
+ .map(d => d.instruction.extendWith.valueOf()));
457
+ const nonPartialWithInclusion = nonPartialDiagnostics.map((d) => {
458
+ const includeOwnOnly = (d.ownChangedSingle
459
+ && !d.fullChangedSingle
460
+ && !d.parentHasTargetMatch
461
+ && !fullChangedExtendWith.has(d.instruction.extendWith.valueOf()));
462
+ return { ...d, includeOwnOnly };
463
+ });
464
+ const nonPartialOwnOnly = nonPartialWithInclusion
465
+ .filter(x => x.includeOwnOnly)
466
+ .map(x => x.instruction);
467
+ const ownAfterPartialAndOwnOnlyNonPartial = applyExtendsToSelector(ownSelector, [...partialOnly, ...nonPartialOwnOnly]);
468
+ const ownAfterPartial = applyExtendsToSelector(ownSelector, partialOnly);
469
+ const ownAfterNonPartial = applyExtendsToSelector(ownSelector, nonPartialOnly);
470
+ const ownAfterAll = applyExtendsToSelector(ownSelector, visibleExtends);
471
+ const fullAfterNonPartial = applyExtendsToSelector(selector, nonPartialOnly);
472
+ const ownChangedByNonPartial = ownAfterNonPartial.valueOf() !== ownSelector.valueOf();
473
+ const fullChangedByNonPartial = fullAfterNonPartial.valueOf() !== selector.valueOf();
474
+ const nonPartialBoundaryOnly = !ownChangedByNonPartial && fullChangedByNonPartial;
475
+ const ownChangedByPartial = ownAfterPartial.valueOf() !== ownSelector.valueOf();
476
+ const hasAncestorDrivenNonPartial = nonPartialWithInclusion.some(d => !d.ownChangedSingle
477
+ && d.fullChangedSingle
478
+ && d.parentHasTargetMatch);
479
+ const shouldDeferToParentForNonPartial = Boolean(!ownChangedByPartial
480
+ && nonPartialOwnOnly.length === 0
481
+ && hasAncestorDrivenNonPartial);
482
+ const hasParentMatchedOwnOnlyNonPartial = nonPartialWithInclusion.some(d => d.ownChangedSingle
483
+ && !d.fullChangedSingle
484
+ && d.parentHasTargetMatch);
485
+ // When non-partial extends match only the full (cross-product) selector and not
486
+ // the own selector, and partial extends would incorrectly alter the own selector,
487
+ // the non-partial extend takes precedence. Applying partial extends to the own
488
+ // selector here blocks cross-product de-distribution (`:is(parent) :is(own), .rep_ace`).
489
+ if (nonPartialBoundaryOnly && (ownChangedByPartial || nonPartialOwnOnly.length > 0)) {
490
+ const newSel = applyExtendsToSelector(selector, nonPartialOnly);
491
+ if (newSel.valueOf() !== selector.valueOf()) {
492
+ newSel.hoistToRoot = true;
493
+ ruleset.value.selector = newSel;
494
+ ruleset.invalidateSelectorValueCache();
495
+ ruleset.hoistToRoot = true;
496
+ }
497
+ continue;
498
+ }
499
+ // For nested rulesets, apply partial (`all`) updates to own selector, but do not
500
+ // fold non-partial changes into own selector. Non-partial changes are handled
501
+ // through full-selector assignment path below when needed.
502
+ if (ownChangedByPartial || nonPartialOwnOnly.length > 0) {
503
+ ruleset.value.selector = ownAfterPartialAndOwnOnlyNonPartial;
504
+ ruleset.options.ownSelector = ownAfterPartialAndOwnOnlyNonPartial;
505
+ ruleset.invalidateSelectorValueCache();
506
+ continue;
507
+ }
508
+ if (hasParentMatchedOwnOnlyNonPartial) {
509
+ // Less parity: exact extends that only match nested own selector while parent already
510
+ // carries the target should remain parent-scoped (do not inject extender into child selector).
511
+ ruleset.value.selector = ownAfterPartial;
512
+ ruleset.options.ownSelector = ownAfterPartial;
513
+ ruleset.invalidateSelectorValueCache();
514
+ continue;
515
+ }
516
+ if (shouldDeferToParentForNonPartial) {
517
+ // Parent selector already carries the non-partial extend effect.
518
+ // Keep this nested ruleset relative to its own selector to avoid
519
+ // re-materializing parent prefixes inside nested blocks.
520
+ ruleset.value.selector = ownAfterPartial;
521
+ ruleset.options.ownSelector = ownAfterPartial;
522
+ ruleset.invalidateSelectorValueCache();
523
+ continue;
524
+ }
525
+ }
526
+ }
527
+ let newSelector = applyExtendsToSelector(selector, visibleExtends);
528
+ if (newSelector !== selector) {
529
+ const beforeValue = selector.valueOf();
530
+ const ownRelevantExtends = (ownSelector && hasResolvedNestedSelector)
531
+ ? visibleExtends.filter(instruction => instruction.partial)
532
+ : visibleExtends;
533
+ const ownAfterRelevant = (ownSelector && hasResolvedNestedSelector)
534
+ ? applyExtendsToSelector(ownSelector, ownRelevantExtends)
535
+ : null;
536
+ const ownChangedByRelevant = Boolean(ownSelector
537
+ && ownAfterRelevant
538
+ && ownAfterRelevant.valueOf() !== ownSelector.valueOf());
539
+ const parentRuleset = (ruleset.parent?.parent && isNode(ruleset.parent.parent, 'Ruleset')
540
+ ? ruleset.parent.parent
541
+ : null);
542
+ const parentSelectorForBoundary = parentRuleset?.value.selector;
543
+ const parentHasCombinatorContext = Boolean(parentSelectorForBoundary
544
+ && !(parentSelectorForBoundary instanceof Nil)
545
+ && (() => {
546
+ try {
547
+ for (const n of parentSelectorForBoundary.nodes()) {
548
+ if (isNode(n, 'Combinator')) {
549
+ return true;
550
+ }
551
+ }
552
+ }
553
+ catch { }
554
+ return false;
555
+ })());
556
+ const parentHoistedBoundaryCompose = Boolean(ownSelector
557
+ && hasResolvedNestedSelector
558
+ && !hasOnlyPartialExtends
559
+ && !ownChangedByRelevant
560
+ && rootRules.options?.referenceMode !== true
561
+ && parentRuleset?.hoistToRoot
562
+ && !newSelector.hoistToRoot);
563
+ if (parentHoistedBoundaryCompose) {
564
+ const parentSelector = parentRuleset?.value.selector;
565
+ if (parentSelector && !(parentSelector instanceof Nil) && isNode(parentSelector, 'SelectorList')) {
566
+ const parentItems = parentSelector.value;
567
+ const complexItems = parentItems.filter(item => isNode(item, 'ComplexSelector'));
568
+ if (complexItems.length === parentItems.length && complexItems.length >= 2) {
569
+ const first = complexItems[0];
570
+ const allTri = complexItems.every(c => c.value.length === 3 && isNode(c.value[1], 'Combinator'));
571
+ if (allTri) {
572
+ const leftKey = first.value[0].valueOf();
573
+ const combKey = first.value[1].valueOf();
574
+ const samePrefix = complexItems.every(c => c.value[0].valueOf() === leftKey
575
+ && c.value[1].valueOf() === combKey);
576
+ if (samePrefix) {
577
+ const ownSelectorNode = ownSelector;
578
+ const middleIs = PseudoSelector.create({
579
+ name: ':is',
580
+ arg: SelectorList.create(complexItems.map(c => c.value[2].copy(true)))
581
+ });
582
+ const parentFactored = ComplexSelector.create([
583
+ first.value[0].copy(true),
584
+ first.value[1].copy(true),
585
+ middleIs
586
+ ]);
587
+ const ownArg = isNode(ownSelectorNode, 'SelectorList')
588
+ ? SelectorList.create(ownSelectorNode.value.map(s => s.copy(true)))
589
+ : SelectorList.create([ownSelectorNode.copy(true)]);
590
+ const ownIs = PseudoSelector.create({ name: ':is', arg: ownArg });
591
+ newSelector = ComplexSelector.create([
592
+ ...parentFactored.value.map(c => c.copy(true)),
593
+ Combinator.create(' '),
594
+ ownIs
595
+ ]).inherit(newSelector);
596
+ newSelector.hoistToRoot = true;
597
+ }
598
+ }
599
+ }
600
+ }
601
+ }
602
+ const boundaryOnlyNestedExactChange = Boolean(ownSelector
603
+ && hasResolvedNestedSelector
604
+ && !hasOnlyPartialExtends
605
+ && !ownChangedByRelevant
606
+ && parentHasCombinatorContext
607
+ && !(ruleset.parent?.parent
608
+ && isNode(ruleset.parent.parent, 'Ruleset')
609
+ && Boolean(ruleset.parent.parent.hoistToRoot))
610
+ && !newSelector.hoistToRoot);
611
+ if (boundaryOnlyNestedExactChange) {
612
+ newSelector.hoistToRoot = true;
613
+ }
614
+ const finalAfterValue = newSelector.valueOf();
615
+ if (beforeValue === finalAfterValue) {
616
+ continue;
617
+ }
618
+ if (hasOnlyPartialExtends && isNode(newSelector, 'SelectorList')) {
619
+ const previousValues = new Set();
620
+ if (isNode(selector, 'SelectorList')) {
621
+ for (const item of selector.value) {
622
+ previousValues.add(item.valueOf());
623
+ }
624
+ }
625
+ else {
626
+ previousValues.add(selector.valueOf());
627
+ }
628
+ for (const item of newSelector.value) {
629
+ if (!previousValues.has(item.valueOf())) {
630
+ item.addFlag(F_EXTENDED);
631
+ }
632
+ }
633
+ }
634
+ ruleset.value.selector = newSelector;
635
+ ruleset.invalidateSelectorValueCache();
636
+ if (newSelector.hoistToRoot) {
637
+ ruleset.hoistToRoot = true;
638
+ }
639
+ }
640
+ }
641
+ }
642
+ for (const instruction of instructions) {
643
+ const stats = instructionStats.get(instruction);
644
+ if (!stats || instruction.fromReferenceScope === true) {
645
+ continue;
646
+ }
647
+ if (stats.visibleMatchCount > 0) {
648
+ continue;
649
+ }
650
+ const target = instruction.target.valueOf();
651
+ const targetLocation = instruction.target.location;
652
+ const targetLine = targetLocation.length >= 2 ? targetLocation[1] : undefined;
653
+ const targetColumn = targetLocation.length >= 3 ? targetLocation[2] : undefined;
654
+ const targetFile = instruction.target.treeContext?.file;
655
+ const targetFilePath = targetFile?.fullPath;
656
+ const inaccessibleMatchExists = Array.from(context.extendRoots.getAllRoots()).some((root) => {
657
+ if (isInstructionVisibleForRoot(context, root, instruction)) {
658
+ return false;
659
+ }
660
+ return rootHasTargetMatch(root, instruction.target, instruction.partial);
661
+ });
662
+ const blockedProtectedRootExists = Array.from(context.extendRoots.getAllRoots()).some(root => !isInstructionVisibleForRoot(context, root, instruction)
663
+ && context.extendRoots.isProtectedRoot(root));
664
+ const diagnostic = (stats.blockedMatchCount > 0 || inaccessibleMatchExists || blockedProtectedRootExists
665
+ ? WARN.extendNotAccessible({
666
+ ctx: targetFile ? { file: targetFile } : undefined,
667
+ filePath: targetFilePath,
668
+ line: targetLine,
669
+ column: targetColumn,
670
+ meta: { target }
671
+ })
672
+ : WARN.extendNotFound({
673
+ ctx: targetFile ? { file: targetFile } : undefined,
674
+ filePath: targetFilePath,
675
+ line: targetLine,
676
+ column: targetColumn,
677
+ meta: { target }
678
+ }));
679
+ context.warnings.push(toDiagnostic(diagnostic));
680
+ }
681
+ }
682
+ //# sourceMappingURL=extend-roots.js.map