@jesscss/core 2.0.0-alpha.4 → 2.0.0-alpha.6

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 (637) hide show
  1. package/lib/index.cjs +20159 -0
  2. package/lib/index.d.cts +5993 -0
  3. package/lib/index.d.cts.map +1 -0
  4. package/lib/index.d.ts +5992 -21
  5. package/lib/index.d.ts.map +1 -1
  6. package/lib/index.js +19926 -22
  7. package/lib/index.js.map +1 -1
  8. package/package.json +15 -14
  9. package/src/__tests__/define-function-record.test.ts +58 -0
  10. package/src/__tests__/define-function-simple.test.ts +55 -0
  11. package/src/__tests__/define-function-split-sequence.test.ts +547 -0
  12. package/src/__tests__/define-function-type-parity.test.ts +9 -0
  13. package/src/__tests__/define-function.test.ts +763 -0
  14. package/src/__tests__/num-operations.test.ts +91 -0
  15. package/src/__tests__/safe-parse.test.ts +374 -0
  16. package/src/context.ts +896 -0
  17. package/src/conversions.ts +282 -0
  18. package/src/debug-log.ts +29 -0
  19. package/src/define-function.ts +1006 -0
  20. package/src/deprecation.ts +67 -0
  21. package/src/globals.d.ts +26 -0
  22. package/src/index.ts +31 -0
  23. package/src/jess-error.ts +773 -0
  24. package/src/logger/deprecation-processing.ts +109 -0
  25. package/src/logger.ts +31 -0
  26. package/src/plugin.ts +292 -0
  27. package/src/tree/LOOKUP_CHAINS.md +35 -0
  28. package/src/tree/README.md +18 -0
  29. package/src/tree/__tests__/__snapshots__/extend-eval-integration.test.ts.snap +1455 -0
  30. package/src/tree/__tests__/ampersand.test.ts +382 -0
  31. package/src/tree/__tests__/at-rule.test.ts +2047 -0
  32. package/src/tree/__tests__/basic-render.test.ts +212 -0
  33. package/src/tree/__tests__/block.test.ts +40 -0
  34. package/src/tree/__tests__/call.test.ts +346 -0
  35. package/src/tree/__tests__/color.test.ts +537 -0
  36. package/src/tree/__tests__/condition.test.ts +186 -0
  37. package/src/tree/__tests__/control.test.ts +564 -0
  38. package/src/tree/__tests__/declaration.test.ts +253 -0
  39. package/src/tree/__tests__/dependency-graph.test.ts +177 -0
  40. package/src/tree/__tests__/detached-rulesets.test.ts +213 -0
  41. package/src/tree/__tests__/dimension.test.ts +236 -0
  42. package/src/tree/__tests__/expression.test.ts +73 -0
  43. package/src/tree/__tests__/ext-node.test.ts +31 -0
  44. package/src/tree/__tests__/extend-eval-integration.test.ts +1033 -0
  45. package/src/tree/__tests__/extend-import-style.test.ts +929 -0
  46. package/src/tree/__tests__/extend-less-fixtures.test.ts +851 -0
  47. package/src/tree/__tests__/extend-list.test.ts +31 -0
  48. package/src/tree/__tests__/extend-roots.test.ts +1045 -0
  49. package/src/tree/__tests__/extend-rules.test.ts +740 -0
  50. package/src/tree/__tests__/func.test.ts +171 -0
  51. package/src/tree/__tests__/import-js.test.ts +33 -0
  52. package/src/tree/__tests__/import-style-test-helpers.ts +56 -0
  53. package/src/tree/__tests__/import-style.test.ts +1967 -0
  54. package/src/tree/__tests__/interpolated-reference.test.ts +44 -0
  55. package/src/tree/__tests__/interpolated.test.ts +41 -0
  56. package/src/tree/__tests__/list.test.ts +177 -0
  57. package/src/tree/__tests__/log.test.ts +83 -0
  58. package/src/tree/__tests__/mixin-recursion.test.ts +639 -0
  59. package/src/tree/__tests__/mixin.test.ts +2171 -0
  60. package/src/tree/__tests__/negative.test.ts +45 -0
  61. package/src/tree/__tests__/nesting-collapse.test.ts +519 -0
  62. package/src/tree/__tests__/node-flags-perf.test.ts +195 -0
  63. package/src/tree/__tests__/node-flags.test.ts +410 -0
  64. package/src/tree/__tests__/node-graph.test.ts +598 -0
  65. package/src/tree/__tests__/node-mutation.test.ts +182 -0
  66. package/src/tree/__tests__/operation.test.ts +18 -0
  67. package/src/tree/__tests__/paren.test.ts +90 -0
  68. package/src/tree/__tests__/preserve-mode-output.test.ts +50 -0
  69. package/src/tree/__tests__/quoted.test.ts +72 -0
  70. package/src/tree/__tests__/range.test.ts +59 -0
  71. package/src/tree/__tests__/reference.test.ts +743 -0
  72. package/src/tree/__tests__/rest.test.ts +29 -0
  73. package/src/tree/__tests__/rules-raw.test.ts +14 -0
  74. package/src/tree/__tests__/rules.test.ts +1271 -0
  75. package/src/tree/__tests__/ruleset.test.ts +597 -0
  76. package/src/tree/__tests__/selector-attr.test.ts +50 -0
  77. package/src/tree/__tests__/selector-basic.test.ts +44 -0
  78. package/src/tree/__tests__/selector-capture.test.ts +22 -0
  79. package/src/tree/__tests__/selector-complex.test.ts +120 -0
  80. package/src/tree/__tests__/selector-compound.test.ts +74 -0
  81. package/src/tree/__tests__/selector-interpolated.test.ts +50 -0
  82. package/src/tree/__tests__/selector-list.test.ts +59 -0
  83. package/src/tree/__tests__/selector-pseudo.test.ts +23 -0
  84. package/src/tree/__tests__/selector.test.ts +182 -0
  85. package/src/tree/__tests__/sequence.test.ts +226 -0
  86. package/src/tree/__tests__/serialize-types.test.ts +529 -0
  87. package/src/tree/__tests__/spaced.test.ts +8 -0
  88. package/src/tree/__tests__/url.test.ts +72 -0
  89. package/src/tree/__tests__/var-declaration.test.ts +90 -0
  90. package/src/tree/ampersand.ts +538 -0
  91. package/src/tree/any.ts +169 -0
  92. package/src/tree/at-rule.ts +760 -0
  93. package/src/tree/block.ts +72 -0
  94. package/src/tree/bool.ts +46 -0
  95. package/src/tree/call.ts +593 -0
  96. package/src/tree/collection.ts +52 -0
  97. package/src/tree/color.ts +629 -0
  98. package/src/tree/combinator.ts +30 -0
  99. package/src/tree/comment.ts +36 -0
  100. package/src/tree/condition.ts +194 -0
  101. package/src/tree/control.ts +452 -0
  102. package/src/tree/declaration-custom.ts +56 -0
  103. package/src/tree/declaration-var.ts +87 -0
  104. package/src/tree/declaration.ts +742 -0
  105. package/src/tree/default-guard.ts +35 -0
  106. package/src/tree/dimension.ts +392 -0
  107. package/src/tree/expression.ts +97 -0
  108. package/src/tree/extend-list.ts +51 -0
  109. package/src/tree/extend.ts +391 -0
  110. package/src/tree/function.ts +254 -0
  111. package/src/tree/import-js.ts +130 -0
  112. package/src/tree/import-style.ts +875 -0
  113. package/{lib/tree/index.js → src/tree/index.ts} +49 -22
  114. package/src/tree/interpolated.ts +346 -0
  115. package/src/tree/js-array.ts +21 -0
  116. package/src/tree/js-expr.ts +50 -0
  117. package/src/tree/js-function.ts +31 -0
  118. package/src/tree/js-object.ts +22 -0
  119. package/src/tree/list.ts +415 -0
  120. package/src/tree/log.ts +89 -0
  121. package/src/tree/mixin.ts +331 -0
  122. package/src/tree/negative.ts +58 -0
  123. package/src/tree/nil.ts +57 -0
  124. package/src/tree/node-base.ts +1716 -0
  125. package/src/tree/node-type.ts +122 -0
  126. package/src/tree/node.ts +118 -0
  127. package/src/tree/number.ts +54 -0
  128. package/src/tree/operation.ts +187 -0
  129. package/src/tree/paren.ts +132 -0
  130. package/src/tree/query-condition.ts +47 -0
  131. package/src/tree/quoted.ts +119 -0
  132. package/src/tree/range.ts +101 -0
  133. package/src/tree/reference.ts +1099 -0
  134. package/src/tree/rest.ts +55 -0
  135. package/src/tree/rules-raw.ts +52 -0
  136. package/src/tree/rules.ts +2896 -0
  137. package/src/tree/ruleset.ts +1217 -0
  138. package/src/tree/selector-attr.ts +172 -0
  139. package/src/tree/selector-basic.ts +75 -0
  140. package/src/tree/selector-capture.ts +85 -0
  141. package/src/tree/selector-complex.ts +189 -0
  142. package/src/tree/selector-compound.ts +205 -0
  143. package/src/tree/selector-interpolated.ts +95 -0
  144. package/src/tree/selector-list.ts +245 -0
  145. package/src/tree/selector-pseudo.ts +173 -0
  146. package/src/tree/selector-simple.ts +10 -0
  147. package/src/tree/selector.ts +152 -0
  148. package/src/tree/sequence.ts +463 -0
  149. package/src/tree/tree.ts +130 -0
  150. package/src/tree/url.ts +95 -0
  151. package/src/tree/util/EXTEND_ARCHITECTURE_ANALYSIS.md +215 -0
  152. package/src/tree/util/EXTEND_AUDIT.md +233 -0
  153. package/src/tree/util/EXTEND_BASELINE.md +64 -0
  154. package/src/tree/util/EXTEND_CALL_GRAPH_ANALYSIS.md +244 -0
  155. package/src/tree/util/EXTEND_DOCS.md +24 -0
  156. package/src/tree/util/EXTEND_FINAL_SUMMARY.md +95 -0
  157. package/src/tree/util/EXTEND_FUNCTION_AUDIT.md +1433 -0
  158. package/src/tree/util/EXTEND_OPTIMIZATION_PLAN.md +114 -0
  159. package/src/tree/util/EXTEND_REFACTORING_SUMMARY.md +152 -0
  160. package/src/tree/util/EXTEND_RULES.md +74 -0
  161. package/src/tree/util/EXTEND_UNUSED_FUNCTIONS.md +127 -0
  162. package/src/tree/util/EXTEND_UNUSED_FUNCTIONS_ANALYSIS.md +227 -0
  163. package/src/tree/util/NODE_COPY_REDUCTION_PLAN.md +12 -0
  164. package/src/tree/util/__tests__/EXTEND_TEST_INDEX.md +59 -0
  165. package/src/tree/util/__tests__/OPTIMIZATION-ANALYSIS.md +130 -0
  166. package/src/tree/util/__tests__/WALK_AND_CONSUME_DESIGN.md +138 -0
  167. package/src/tree/util/__tests__/_archive/2026-02-09__OPTIMIZATION-ANALYSIS.md +9 -0
  168. package/src/tree/util/__tests__/_archive/README.md +4 -0
  169. package/src/tree/util/__tests__/bitset.test.ts +142 -0
  170. package/src/tree/util/__tests__/debug-log.ts +50 -0
  171. package/src/tree/util/__tests__/extend-comment-handling.test.ts +187 -0
  172. package/src/tree/util/__tests__/extend-core-unit.test.ts +941 -0
  173. package/src/tree/util/__tests__/extend-pipeline-bench.test.ts +154 -0
  174. package/src/tree/util/__tests__/extend-pipeline-bench.ts +190 -0
  175. package/src/tree/util/__tests__/fast-reject.test.ts +377 -0
  176. package/src/tree/util/__tests__/is-node.test.ts +63 -0
  177. package/src/tree/util/__tests__/list-like.test.ts +63 -0
  178. package/src/tree/util/__tests__/outputwriter.test.ts +523 -0
  179. package/src/tree/util/__tests__/print.test.ts +183 -0
  180. package/src/tree/util/__tests__/process-extends.test.ts +226 -0
  181. package/src/tree/util/__tests__/process-leading-is.test.ts +205 -0
  182. package/src/tree/util/__tests__/recursion-helper.test.ts +184 -0
  183. package/src/tree/util/__tests__/selector-match-unit.test.ts +1427 -0
  184. package/src/tree/util/__tests__/sourcemap.test.ts +117 -0
  185. package/src/tree/util/ampersand-template.ts +9 -0
  186. package/src/tree/util/bitset.ts +194 -0
  187. package/src/tree/util/calculate.ts +11 -0
  188. package/src/tree/util/cast.ts +89 -0
  189. package/src/tree/util/cloning.ts +8 -0
  190. package/src/tree/util/collections.ts +299 -0
  191. package/src/tree/util/compare.ts +90 -0
  192. package/src/tree/util/cursor.ts +171 -0
  193. package/src/tree/util/extend-core.ts +2139 -0
  194. package/src/tree/util/extend-roots.ts +1108 -0
  195. package/src/tree/util/field-helpers.ts +354 -0
  196. package/src/tree/util/is-node.ts +43 -0
  197. package/src/tree/util/list-like.ts +93 -0
  198. package/src/tree/util/mixin-instance-primitives.ts +2020 -0
  199. package/src/tree/util/print.ts +303 -0
  200. package/src/tree/util/process-leading-is.ts +421 -0
  201. package/src/tree/util/recursion-helper.ts +54 -0
  202. package/src/tree/util/regex.ts +2 -0
  203. package/src/tree/util/registry-utils.ts +1953 -0
  204. package/src/tree/util/ruleset-trace.ts +17 -0
  205. package/src/tree/util/scoped-body-eval.ts +320 -0
  206. package/src/tree/util/selector-match-core.ts +2005 -0
  207. package/src/tree/util/selector-utils.ts +757 -0
  208. package/src/tree/util/serialize-helper.ts +535 -0
  209. package/src/tree/util/serialize-types.ts +318 -0
  210. package/src/tree/util/should-operate.ts +78 -0
  211. package/src/tree/util/sourcemap.ts +37 -0
  212. package/src/types/config.ts +247 -0
  213. package/src/types/index.ts +12 -0
  214. package/{lib/types/modes.d.ts → src/types/modes.ts} +2 -1
  215. package/src/types.d.ts +9 -0
  216. package/src/types.ts +68 -0
  217. package/src/use-webpack-resolver.ts +56 -0
  218. package/src/visitor/__tests__/visitor.test.ts +136 -0
  219. package/src/visitor/index.ts +263 -0
  220. package/{lib/visitor/less-visitor.js → src/visitor/less-visitor.ts} +3 -2
  221. package/lib/context.d.ts +0 -352
  222. package/lib/context.d.ts.map +0 -1
  223. package/lib/context.js +0 -636
  224. package/lib/context.js.map +0 -1
  225. package/lib/conversions.d.ts +0 -73
  226. package/lib/conversions.d.ts.map +0 -1
  227. package/lib/conversions.js +0 -253
  228. package/lib/conversions.js.map +0 -1
  229. package/lib/debug-log.d.ts +0 -2
  230. package/lib/debug-log.d.ts.map +0 -1
  231. package/lib/debug-log.js +0 -27
  232. package/lib/debug-log.js.map +0 -1
  233. package/lib/define-function.d.ts +0 -587
  234. package/lib/define-function.d.ts.map +0 -1
  235. package/lib/define-function.js +0 -726
  236. package/lib/define-function.js.map +0 -1
  237. package/lib/deprecation.d.ts +0 -34
  238. package/lib/deprecation.d.ts.map +0 -1
  239. package/lib/deprecation.js +0 -57
  240. package/lib/deprecation.js.map +0 -1
  241. package/lib/jess-error.d.ts +0 -343
  242. package/lib/jess-error.d.ts.map +0 -1
  243. package/lib/jess-error.js +0 -508
  244. package/lib/jess-error.js.map +0 -1
  245. package/lib/logger/deprecation-processing.d.ts +0 -41
  246. package/lib/logger/deprecation-processing.d.ts.map +0 -1
  247. package/lib/logger/deprecation-processing.js +0 -81
  248. package/lib/logger/deprecation-processing.js.map +0 -1
  249. package/lib/logger.d.ts +0 -10
  250. package/lib/logger.d.ts.map +0 -1
  251. package/lib/logger.js +0 -20
  252. package/lib/logger.js.map +0 -1
  253. package/lib/plugin.d.ts +0 -94
  254. package/lib/plugin.d.ts.map +0 -1
  255. package/lib/plugin.js +0 -174
  256. package/lib/plugin.js.map +0 -1
  257. package/lib/tree/ampersand.d.ts +0 -94
  258. package/lib/tree/ampersand.d.ts.map +0 -1
  259. package/lib/tree/ampersand.js +0 -269
  260. package/lib/tree/ampersand.js.map +0 -1
  261. package/lib/tree/any.d.ts +0 -58
  262. package/lib/tree/any.d.ts.map +0 -1
  263. package/lib/tree/any.js +0 -104
  264. package/lib/tree/any.js.map +0 -1
  265. package/lib/tree/at-rule.d.ts +0 -53
  266. package/lib/tree/at-rule.d.ts.map +0 -1
  267. package/lib/tree/at-rule.js +0 -503
  268. package/lib/tree/at-rule.js.map +0 -1
  269. package/lib/tree/block.d.ts +0 -22
  270. package/lib/tree/block.d.ts.map +0 -1
  271. package/lib/tree/block.js +0 -24
  272. package/lib/tree/block.js.map +0 -1
  273. package/lib/tree/bool.d.ts +0 -18
  274. package/lib/tree/bool.d.ts.map +0 -1
  275. package/lib/tree/bool.js +0 -28
  276. package/lib/tree/bool.js.map +0 -1
  277. package/lib/tree/call.d.ts +0 -66
  278. package/lib/tree/call.d.ts.map +0 -1
  279. package/lib/tree/call.js +0 -306
  280. package/lib/tree/call.js.map +0 -1
  281. package/lib/tree/collection.d.ts +0 -30
  282. package/lib/tree/collection.d.ts.map +0 -1
  283. package/lib/tree/collection.js +0 -37
  284. package/lib/tree/collection.js.map +0 -1
  285. package/lib/tree/color.d.ts +0 -101
  286. package/lib/tree/color.d.ts.map +0 -1
  287. package/lib/tree/color.js +0 -513
  288. package/lib/tree/color.js.map +0 -1
  289. package/lib/tree/combinator.d.ts +0 -13
  290. package/lib/tree/combinator.d.ts.map +0 -1
  291. package/lib/tree/combinator.js +0 -12
  292. package/lib/tree/combinator.js.map +0 -1
  293. package/lib/tree/comment.d.ts +0 -20
  294. package/lib/tree/comment.d.ts.map +0 -1
  295. package/lib/tree/comment.js +0 -19
  296. package/lib/tree/comment.js.map +0 -1
  297. package/lib/tree/condition.d.ts +0 -31
  298. package/lib/tree/condition.d.ts.map +0 -1
  299. package/lib/tree/condition.js +0 -103
  300. package/lib/tree/condition.js.map +0 -1
  301. package/lib/tree/control.d.ts +0 -104
  302. package/lib/tree/control.d.ts.map +0 -1
  303. package/lib/tree/control.js +0 -430
  304. package/lib/tree/control.js.map +0 -1
  305. package/lib/tree/declaration-custom.d.ts +0 -18
  306. package/lib/tree/declaration-custom.d.ts.map +0 -1
  307. package/lib/tree/declaration-custom.js +0 -24
  308. package/lib/tree/declaration-custom.js.map +0 -1
  309. package/lib/tree/declaration-var.d.ts +0 -35
  310. package/lib/tree/declaration-var.d.ts.map +0 -1
  311. package/lib/tree/declaration-var.js +0 -63
  312. package/lib/tree/declaration-var.js.map +0 -1
  313. package/lib/tree/declaration.d.ts +0 -78
  314. package/lib/tree/declaration.d.ts.map +0 -1
  315. package/lib/tree/declaration.js +0 -286
  316. package/lib/tree/declaration.js.map +0 -1
  317. package/lib/tree/default-guard.d.ts +0 -15
  318. package/lib/tree/default-guard.d.ts.map +0 -1
  319. package/lib/tree/default-guard.js +0 -19
  320. package/lib/tree/default-guard.js.map +0 -1
  321. package/lib/tree/dimension.d.ts +0 -34
  322. package/lib/tree/dimension.d.ts.map +0 -1
  323. package/lib/tree/dimension.js +0 -294
  324. package/lib/tree/dimension.js.map +0 -1
  325. package/lib/tree/expression.d.ts +0 -25
  326. package/lib/tree/expression.d.ts.map +0 -1
  327. package/lib/tree/expression.js +0 -32
  328. package/lib/tree/expression.js.map +0 -1
  329. package/lib/tree/extend-list.d.ts +0 -23
  330. package/lib/tree/extend-list.d.ts.map +0 -1
  331. package/lib/tree/extend-list.js +0 -23
  332. package/lib/tree/extend-list.js.map +0 -1
  333. package/lib/tree/extend.d.ts +0 -47
  334. package/lib/tree/extend.d.ts.map +0 -1
  335. package/lib/tree/extend.js +0 -296
  336. package/lib/tree/extend.js.map +0 -1
  337. package/lib/tree/function.d.ts +0 -48
  338. package/lib/tree/function.d.ts.map +0 -1
  339. package/lib/tree/function.js +0 -74
  340. package/lib/tree/function.js.map +0 -1
  341. package/lib/tree/import-js.d.ts +0 -35
  342. package/lib/tree/import-js.d.ts.map +0 -1
  343. package/lib/tree/import-js.js +0 -45
  344. package/lib/tree/import-js.js.map +0 -1
  345. package/lib/tree/import-style.d.ts +0 -156
  346. package/lib/tree/import-style.d.ts.map +0 -1
  347. package/lib/tree/import-style.js +0 -566
  348. package/lib/tree/import-style.js.map +0 -1
  349. package/lib/tree/index.d.ts +0 -71
  350. package/lib/tree/index.d.ts.map +0 -1
  351. package/lib/tree/index.js.map +0 -1
  352. package/lib/tree/interpolated-reference.d.ts +0 -24
  353. package/lib/tree/interpolated-reference.d.ts.map +0 -1
  354. package/lib/tree/interpolated-reference.js +0 -37
  355. package/lib/tree/interpolated-reference.js.map +0 -1
  356. package/lib/tree/interpolated.d.ts +0 -62
  357. package/lib/tree/interpolated.d.ts.map +0 -1
  358. package/lib/tree/interpolated.js +0 -204
  359. package/lib/tree/interpolated.js.map +0 -1
  360. package/lib/tree/js-array.d.ts +0 -10
  361. package/lib/tree/js-array.d.ts.map +0 -1
  362. package/lib/tree/js-array.js +0 -10
  363. package/lib/tree/js-array.js.map +0 -1
  364. package/lib/tree/js-expr.d.ts +0 -23
  365. package/lib/tree/js-expr.d.ts.map +0 -1
  366. package/lib/tree/js-expr.js +0 -28
  367. package/lib/tree/js-expr.js.map +0 -1
  368. package/lib/tree/js-function.d.ts +0 -20
  369. package/lib/tree/js-function.d.ts.map +0 -1
  370. package/lib/tree/js-function.js +0 -16
  371. package/lib/tree/js-function.js.map +0 -1
  372. package/lib/tree/js-object.d.ts +0 -10
  373. package/lib/tree/js-object.d.ts.map +0 -1
  374. package/lib/tree/js-object.js +0 -10
  375. package/lib/tree/js-object.js.map +0 -1
  376. package/lib/tree/list.d.ts +0 -38
  377. package/lib/tree/list.d.ts.map +0 -1
  378. package/lib/tree/list.js +0 -83
  379. package/lib/tree/list.js.map +0 -1
  380. package/lib/tree/log.d.ts +0 -29
  381. package/lib/tree/log.d.ts.map +0 -1
  382. package/lib/tree/log.js +0 -56
  383. package/lib/tree/log.js.map +0 -1
  384. package/lib/tree/mixin.d.ts +0 -87
  385. package/lib/tree/mixin.d.ts.map +0 -1
  386. package/lib/tree/mixin.js +0 -112
  387. package/lib/tree/mixin.js.map +0 -1
  388. package/lib/tree/negative.d.ts +0 -17
  389. package/lib/tree/negative.d.ts.map +0 -1
  390. package/lib/tree/negative.js +0 -22
  391. package/lib/tree/negative.js.map +0 -1
  392. package/lib/tree/nil.d.ts +0 -30
  393. package/lib/tree/nil.d.ts.map +0 -1
  394. package/lib/tree/nil.js +0 -35
  395. package/lib/tree/nil.js.map +0 -1
  396. package/lib/tree/node-base.d.ts +0 -361
  397. package/lib/tree/node-base.d.ts.map +0 -1
  398. package/lib/tree/node-base.js +0 -930
  399. package/lib/tree/node-base.js.map +0 -1
  400. package/lib/tree/node.d.ts +0 -10
  401. package/lib/tree/node.d.ts.map +0 -1
  402. package/lib/tree/node.js +0 -45
  403. package/lib/tree/node.js.map +0 -1
  404. package/lib/tree/number.d.ts +0 -21
  405. package/lib/tree/number.d.ts.map +0 -1
  406. package/lib/tree/number.js +0 -27
  407. package/lib/tree/number.js.map +0 -1
  408. package/lib/tree/operation.d.ts +0 -26
  409. package/lib/tree/operation.d.ts.map +0 -1
  410. package/lib/tree/operation.js +0 -103
  411. package/lib/tree/operation.js.map +0 -1
  412. package/lib/tree/paren.d.ts +0 -19
  413. package/lib/tree/paren.d.ts.map +0 -1
  414. package/lib/tree/paren.js +0 -92
  415. package/lib/tree/paren.js.map +0 -1
  416. package/lib/tree/query-condition.d.ts +0 -17
  417. package/lib/tree/query-condition.d.ts.map +0 -1
  418. package/lib/tree/query-condition.js +0 -39
  419. package/lib/tree/query-condition.js.map +0 -1
  420. package/lib/tree/quoted.d.ts +0 -28
  421. package/lib/tree/quoted.d.ts.map +0 -1
  422. package/lib/tree/quoted.js +0 -75
  423. package/lib/tree/quoted.js.map +0 -1
  424. package/lib/tree/range.d.ts +0 -33
  425. package/lib/tree/range.d.ts.map +0 -1
  426. package/lib/tree/range.js +0 -47
  427. package/lib/tree/range.js.map +0 -1
  428. package/lib/tree/reference.d.ts +0 -76
  429. package/lib/tree/reference.d.ts.map +0 -1
  430. package/lib/tree/reference.js +0 -521
  431. package/lib/tree/reference.js.map +0 -1
  432. package/lib/tree/rest.d.ts +0 -15
  433. package/lib/tree/rest.d.ts.map +0 -1
  434. package/lib/tree/rest.js +0 -32
  435. package/lib/tree/rest.js.map +0 -1
  436. package/lib/tree/rules-raw.d.ts +0 -17
  437. package/lib/tree/rules-raw.d.ts.map +0 -1
  438. package/lib/tree/rules-raw.js +0 -37
  439. package/lib/tree/rules-raw.js.map +0 -1
  440. package/lib/tree/rules.d.ts +0 -262
  441. package/lib/tree/rules.d.ts.map +0 -1
  442. package/lib/tree/rules.js +0 -2359
  443. package/lib/tree/rules.js.map +0 -1
  444. package/lib/tree/ruleset.d.ts +0 -92
  445. package/lib/tree/ruleset.d.ts.map +0 -1
  446. package/lib/tree/ruleset.js +0 -528
  447. package/lib/tree/ruleset.js.map +0 -1
  448. package/lib/tree/selector-attr.d.ts +0 -31
  449. package/lib/tree/selector-attr.d.ts.map +0 -1
  450. package/lib/tree/selector-attr.js +0 -99
  451. package/lib/tree/selector-attr.js.map +0 -1
  452. package/lib/tree/selector-basic.d.ts +0 -24
  453. package/lib/tree/selector-basic.d.ts.map +0 -1
  454. package/lib/tree/selector-basic.js +0 -38
  455. package/lib/tree/selector-basic.js.map +0 -1
  456. package/lib/tree/selector-capture.d.ts +0 -23
  457. package/lib/tree/selector-capture.d.ts.map +0 -1
  458. package/lib/tree/selector-capture.js +0 -34
  459. package/lib/tree/selector-capture.js.map +0 -1
  460. package/lib/tree/selector-complex.d.ts +0 -40
  461. package/lib/tree/selector-complex.d.ts.map +0 -1
  462. package/lib/tree/selector-complex.js +0 -143
  463. package/lib/tree/selector-complex.js.map +0 -1
  464. package/lib/tree/selector-compound.d.ts +0 -16
  465. package/lib/tree/selector-compound.d.ts.map +0 -1
  466. package/lib/tree/selector-compound.js +0 -114
  467. package/lib/tree/selector-compound.js.map +0 -1
  468. package/lib/tree/selector-interpolated.d.ts +0 -23
  469. package/lib/tree/selector-interpolated.d.ts.map +0 -1
  470. package/lib/tree/selector-interpolated.js +0 -27
  471. package/lib/tree/selector-interpolated.js.map +0 -1
  472. package/lib/tree/selector-list.d.ts +0 -17
  473. package/lib/tree/selector-list.d.ts.map +0 -1
  474. package/lib/tree/selector-list.js +0 -174
  475. package/lib/tree/selector-list.js.map +0 -1
  476. package/lib/tree/selector-pseudo.d.ts +0 -42
  477. package/lib/tree/selector-pseudo.d.ts.map +0 -1
  478. package/lib/tree/selector-pseudo.js +0 -204
  479. package/lib/tree/selector-pseudo.js.map +0 -1
  480. package/lib/tree/selector-simple.d.ts +0 -5
  481. package/lib/tree/selector-simple.d.ts.map +0 -1
  482. package/lib/tree/selector-simple.js +0 -6
  483. package/lib/tree/selector-simple.js.map +0 -1
  484. package/lib/tree/selector.d.ts +0 -43
  485. package/lib/tree/selector.d.ts.map +0 -1
  486. package/lib/tree/selector.js +0 -56
  487. package/lib/tree/selector.js.map +0 -1
  488. package/lib/tree/sequence.d.ts +0 -43
  489. package/lib/tree/sequence.d.ts.map +0 -1
  490. package/lib/tree/sequence.js +0 -151
  491. package/lib/tree/sequence.js.map +0 -1
  492. package/lib/tree/tree.d.ts +0 -87
  493. package/lib/tree/tree.d.ts.map +0 -1
  494. package/lib/tree/tree.js +0 -2
  495. package/lib/tree/tree.js.map +0 -1
  496. package/lib/tree/url.d.ts +0 -18
  497. package/lib/tree/url.d.ts.map +0 -1
  498. package/lib/tree/url.js +0 -35
  499. package/lib/tree/url.js.map +0 -1
  500. package/lib/tree/util/__tests__/debug-log.d.ts +0 -1
  501. package/lib/tree/util/__tests__/debug-log.d.ts.map +0 -1
  502. package/lib/tree/util/__tests__/debug-log.js +0 -36
  503. package/lib/tree/util/__tests__/debug-log.js.map +0 -1
  504. package/lib/tree/util/calculate.d.ts +0 -3
  505. package/lib/tree/util/calculate.d.ts.map +0 -1
  506. package/lib/tree/util/calculate.js +0 -10
  507. package/lib/tree/util/calculate.js.map +0 -1
  508. package/lib/tree/util/cast.d.ts +0 -10
  509. package/lib/tree/util/cast.d.ts.map +0 -1
  510. package/lib/tree/util/cast.js +0 -87
  511. package/lib/tree/util/cast.js.map +0 -1
  512. package/lib/tree/util/cloning.d.ts +0 -4
  513. package/lib/tree/util/cloning.d.ts.map +0 -1
  514. package/lib/tree/util/cloning.js +0 -8
  515. package/lib/tree/util/cloning.js.map +0 -1
  516. package/lib/tree/util/collections.d.ts +0 -57
  517. package/lib/tree/util/collections.d.ts.map +0 -1
  518. package/lib/tree/util/collections.js +0 -136
  519. package/lib/tree/util/collections.js.map +0 -1
  520. package/lib/tree/util/compare.d.ts +0 -11
  521. package/lib/tree/util/compare.d.ts.map +0 -1
  522. package/lib/tree/util/compare.js +0 -89
  523. package/lib/tree/util/compare.js.map +0 -1
  524. package/lib/tree/util/extend-helpers.d.ts +0 -2
  525. package/lib/tree/util/extend-helpers.d.ts.map +0 -1
  526. package/lib/tree/util/extend-helpers.js +0 -2
  527. package/lib/tree/util/extend-helpers.js.map +0 -1
  528. package/lib/tree/util/extend-roots.d.ts +0 -37
  529. package/lib/tree/util/extend-roots.d.ts.map +0 -1
  530. package/lib/tree/util/extend-roots.js +0 -700
  531. package/lib/tree/util/extend-roots.js.map +0 -1
  532. package/lib/tree/util/extend-roots.old.d.ts +0 -132
  533. package/lib/tree/util/extend-roots.old.d.ts.map +0 -1
  534. package/lib/tree/util/extend-roots.old.js +0 -2272
  535. package/lib/tree/util/extend-roots.old.js.map +0 -1
  536. package/lib/tree/util/extend-trace-debug.d.ts +0 -13
  537. package/lib/tree/util/extend-trace-debug.d.ts.map +0 -1
  538. package/lib/tree/util/extend-trace-debug.js +0 -34
  539. package/lib/tree/util/extend-trace-debug.js.map +0 -1
  540. package/lib/tree/util/extend-walk.d.ts +0 -53
  541. package/lib/tree/util/extend-walk.d.ts.map +0 -1
  542. package/lib/tree/util/extend-walk.js +0 -881
  543. package/lib/tree/util/extend-walk.js.map +0 -1
  544. package/lib/tree/util/extend.d.ts +0 -218
  545. package/lib/tree/util/extend.d.ts.map +0 -1
  546. package/lib/tree/util/extend.js +0 -3182
  547. package/lib/tree/util/extend.js.map +0 -1
  548. package/lib/tree/util/find-extendable-locations.d.ts +0 -2
  549. package/lib/tree/util/find-extendable-locations.d.ts.map +0 -1
  550. package/lib/tree/util/find-extendable-locations.js +0 -2
  551. package/lib/tree/util/find-extendable-locations.js.map +0 -1
  552. package/lib/tree/util/format.d.ts +0 -20
  553. package/lib/tree/util/format.d.ts.map +0 -1
  554. package/lib/tree/util/format.js +0 -67
  555. package/lib/tree/util/format.js.map +0 -1
  556. package/lib/tree/util/is-node.d.ts +0 -13
  557. package/lib/tree/util/is-node.d.ts.map +0 -1
  558. package/lib/tree/util/is-node.js +0 -43
  559. package/lib/tree/util/is-node.js.map +0 -1
  560. package/lib/tree/util/print.d.ts +0 -80
  561. package/lib/tree/util/print.d.ts.map +0 -1
  562. package/lib/tree/util/print.js +0 -205
  563. package/lib/tree/util/print.js.map +0 -1
  564. package/lib/tree/util/process-leading-is.d.ts +0 -25
  565. package/lib/tree/util/process-leading-is.d.ts.map +0 -1
  566. package/lib/tree/util/process-leading-is.js +0 -364
  567. package/lib/tree/util/process-leading-is.js.map +0 -1
  568. package/lib/tree/util/recursion-helper.d.ts +0 -15
  569. package/lib/tree/util/recursion-helper.d.ts.map +0 -1
  570. package/lib/tree/util/recursion-helper.js +0 -43
  571. package/lib/tree/util/recursion-helper.js.map +0 -1
  572. package/lib/tree/util/regex.d.ts +0 -4
  573. package/lib/tree/util/regex.d.ts.map +0 -1
  574. package/lib/tree/util/regex.js +0 -4
  575. package/lib/tree/util/regex.js.map +0 -1
  576. package/lib/tree/util/registry-utils.d.ts +0 -192
  577. package/lib/tree/util/registry-utils.d.ts.map +0 -1
  578. package/lib/tree/util/registry-utils.js +0 -1214
  579. package/lib/tree/util/registry-utils.js.map +0 -1
  580. package/lib/tree/util/ruleset-trace.d.ts +0 -4
  581. package/lib/tree/util/ruleset-trace.d.ts.map +0 -1
  582. package/lib/tree/util/ruleset-trace.js +0 -14
  583. package/lib/tree/util/ruleset-trace.js.map +0 -1
  584. package/lib/tree/util/selector-compare.d.ts +0 -2
  585. package/lib/tree/util/selector-compare.d.ts.map +0 -1
  586. package/lib/tree/util/selector-compare.js +0 -2
  587. package/lib/tree/util/selector-compare.js.map +0 -1
  588. package/lib/tree/util/selector-match-core.d.ts +0 -184
  589. package/lib/tree/util/selector-match-core.d.ts.map +0 -1
  590. package/lib/tree/util/selector-match-core.js +0 -1603
  591. package/lib/tree/util/selector-match-core.js.map +0 -1
  592. package/lib/tree/util/selector-utils.d.ts +0 -30
  593. package/lib/tree/util/selector-utils.d.ts.map +0 -1
  594. package/lib/tree/util/selector-utils.js +0 -100
  595. package/lib/tree/util/selector-utils.js.map +0 -1
  596. package/lib/tree/util/serialize-helper.d.ts +0 -13
  597. package/lib/tree/util/serialize-helper.d.ts.map +0 -1
  598. package/lib/tree/util/serialize-helper.js +0 -387
  599. package/lib/tree/util/serialize-helper.js.map +0 -1
  600. package/lib/tree/util/serialize-types.d.ts +0 -9
  601. package/lib/tree/util/serialize-types.d.ts.map +0 -1
  602. package/lib/tree/util/serialize-types.js +0 -216
  603. package/lib/tree/util/serialize-types.js.map +0 -1
  604. package/lib/tree/util/should-operate.d.ts +0 -23
  605. package/lib/tree/util/should-operate.d.ts.map +0 -1
  606. package/lib/tree/util/should-operate.js +0 -46
  607. package/lib/tree/util/should-operate.js.map +0 -1
  608. package/lib/tree/util/sourcemap.d.ts +0 -7
  609. package/lib/tree/util/sourcemap.d.ts.map +0 -1
  610. package/lib/tree/util/sourcemap.js +0 -25
  611. package/lib/tree/util/sourcemap.js.map +0 -1
  612. package/lib/types/config.d.ts +0 -205
  613. package/lib/types/config.d.ts.map +0 -1
  614. package/lib/types/config.js +0 -2
  615. package/lib/types/config.js.map +0 -1
  616. package/lib/types/index.d.ts +0 -15
  617. package/lib/types/index.d.ts.map +0 -1
  618. package/lib/types/index.js +0 -3
  619. package/lib/types/index.js.map +0 -1
  620. package/lib/types/modes.d.ts.map +0 -1
  621. package/lib/types/modes.js +0 -2
  622. package/lib/types/modes.js.map +0 -1
  623. package/lib/types.d.ts +0 -61
  624. package/lib/types.d.ts.map +0 -1
  625. package/lib/types.js +0 -2
  626. package/lib/types.js.map +0 -1
  627. package/lib/use-webpack-resolver.d.ts +0 -9
  628. package/lib/use-webpack-resolver.d.ts.map +0 -1
  629. package/lib/use-webpack-resolver.js +0 -41
  630. package/lib/use-webpack-resolver.js.map +0 -1
  631. package/lib/visitor/index.d.ts +0 -136
  632. package/lib/visitor/index.d.ts.map +0 -1
  633. package/lib/visitor/index.js +0 -135
  634. package/lib/visitor/index.js.map +0 -1
  635. package/lib/visitor/less-visitor.d.ts +0 -7
  636. package/lib/visitor/less-visitor.d.ts.map +0 -1
  637. package/lib/visitor/less-visitor.js.map +0 -1
@@ -0,0 +1,377 @@
1
+ import { amp, compound, el, rules, ruleset, sel, pseudo, co, sellist } from '../../index.js';
2
+ import { Context } from '../../../context.js';
3
+ import { selectorMatch } from '../selector-match-core.js';
4
+
5
+ describe('BitSets and selectors', () => {
6
+ let context: Context;
7
+ beforeEach(() => {
8
+ context = new Context();
9
+ });
10
+
11
+ it('fast rejects simple selectors', async () => {
12
+ let selector = el('.foo');
13
+ await selector.eval(context);
14
+ expect(selector.keySet.equals(context.selectorBits.getBitset(['.foo']))).toBe(true);
15
+ expect(selector.visibleKeySet.equals(context.selectorBits.getBitset(['.foo']))).toBe(true);
16
+ expect(selector.requiredKeySet.equals(context.selectorBits.getBitset(['.foo']))).toBe(true);
17
+ });
18
+
19
+ it('fast rejects compound selectors with simples', async () => {
20
+ let selector = compound([el('.foo'), el('.bar')]);
21
+ await selector.eval(context);
22
+ expect(selector.keySet.equals(context.selectorBits.getBitset(['.foo', '.bar']))).toBe(true);
23
+ expect(selector.visibleKeySet.equals(context.selectorBits.getBitset(['.foo', '.bar']))).toBe(true);
24
+ expect(selector.requiredKeySet.equals(context.selectorBits.getBitset(['.foo', '.bar']))).toBe(true);
25
+ });
26
+
27
+ it('fast rejects complex selectors with simples', async () => {
28
+ let selector = sel([el('.foo'), co(' '), el('.bar')]);
29
+ await selector.eval(context);
30
+ expect(selector.keySet.equals(context.selectorBits.getBitset(['.foo', ' ', '.bar']))).toBe(true);
31
+ expect(selector.visibleKeySet.equals(context.selectorBits.getBitset(['.foo', ' ', '.bar']))).toBe(true);
32
+ expect(selector.requiredKeySet.equals(context.selectorBits.getBitset(['.foo', ' ', '.bar']))).toBe(true);
33
+ });
34
+
35
+ it('fast rejects complex selectors with compounds', async () => {
36
+ let selector = sel([compound([el('a'), el('.foo')]), co(' '), el('.bar')]);
37
+ await selector.eval(context);
38
+ expect(selector.keySet.equals(context.selectorBits.getBitset(['a', '.foo', ' ', '.bar']))).toBe(true);
39
+ expect(selector.visibleKeySet.equals(context.selectorBits.getBitset(['a', '.foo', ' ', '.bar']))).toBe(true);
40
+ expect(selector.requiredKeySet.equals(context.selectorBits.getBitset(['a', '.foo', ' ', '.bar']))).toBe(true);
41
+ });
42
+
43
+ test('fast rejects :is selectors with simple selectors', async () => {
44
+ let selector = sel([pseudo({ name: ':is', arg: el('.foo') })]);
45
+ await selector.eval(context);
46
+ expect(selector.keySet.equals(context.selectorBits.getBitset(['.foo']))).toBe(true);
47
+ expect(selector.visibleKeySet.equals(context.selectorBits.getBitset(['.foo']))).toBe(true);
48
+ // :is(.foo) with a single arg (not a SelectorList) — keys ARE required
49
+ expect(selector.requiredKeySet.equals(context.selectorBits.getBitset(['.foo']))).toBe(true);
50
+ });
51
+
52
+ test(':is with selector list excludes alternatives from requiredKeySet', async () => {
53
+ let selector = sel([pseudo({ name: ':is', arg: sellist([el('.foo'), el('.bar')]) })]);
54
+ await selector.eval(context);
55
+ expect(selector.keySet.equals(context.selectorBits.getBitset(['.foo', '.bar']))).toBe(true);
56
+ expect(selector.visibleKeySet.equals(context.selectorBits.getBitset(['.foo', '.bar']))).toBe(true);
57
+ // :is() alternatives are not required
58
+ expect(selector.requiredKeySet.equals(context.selectorBits.getBitset())).toBe(true);
59
+ });
60
+
61
+ test(':is with selector list in complex selector keeps non-:is keys in requiredKeySet', async () => {
62
+ // :is(.a, .b) .c → keySet={.a,.b,.c}, requiredKeySet={.c}
63
+ let selector = sel([
64
+ pseudo({ name: ':is', arg: sellist([el('.a'), el('.b')]) }),
65
+ co(' '),
66
+ el('.c')
67
+ ]);
68
+ await selector.eval(context);
69
+ expect(selector.keySet.equals(context.selectorBits.getBitset(['.a', '.b', ' ', '.c']))).toBe(true);
70
+ // requiredKeySet has only the non-:is parts
71
+ expect(selector.requiredKeySet.equals(context.selectorBits.getBitset([' ', '.c']))).toBe(true);
72
+ });
73
+
74
+ test('deep :is with selector list excludes alternatives from requiredKeySet', async () => {
75
+ let selector = sel([pseudo({ name: ':is', arg: sel([pseudo({ name: ':is', arg: sellist([el('.foo'), el('.bar')]) })] as any) })]);
76
+ await selector.eval(context);
77
+ expect(selector.keySet.equals(context.selectorBits.getBitset(['.foo', '.bar']))).toBe(true);
78
+ expect(selector.requiredKeySet.equals(context.selectorBits.getBitset())).toBe(true);
79
+ });
80
+
81
+ test(':is with compound arg includes compound keys in requiredKeySet', async () => {
82
+ // :is(.a.b) — single compound, not a SelectorList
83
+ let selector = pseudo({ name: ':is', arg: compound([el('.a'), el('.b')]) });
84
+ await selector.eval(context);
85
+ expect(selector.keySet.equals(context.selectorBits.getBitset(['.a', '.b']))).toBe(true);
86
+ expect(selector.requiredKeySet.equals(context.selectorBits.getBitset(['.a', '.b']))).toBe(true);
87
+ });
88
+
89
+ test(':is with complex arg includes complex keys in requiredKeySet', async () => {
90
+ // :is(.a > .b) — single complex selector, not a SelectorList
91
+ let selector = pseudo({ name: ':is', arg: sel([el('.a'), co('>'), el('.b')]) });
92
+ await selector.eval(context);
93
+ expect(selector.keySet.equals(context.selectorBits.getBitset(['.a', '>', '.b']))).toBe(true);
94
+ expect(selector.requiredKeySet.equals(context.selectorBits.getBitset(['.a', '>', '.b']))).toBe(true);
95
+ });
96
+
97
+ test('complex selector with :is(compound) includes all keys in requiredKeySet', async () => {
98
+ // foo > :is(.a.b) — :is has compound arg, all keys required
99
+ let selector = sel([el('foo'), co('>'), pseudo({ name: ':is', arg: compound([el('.a'), el('.b')]) })]);
100
+ await selector.eval(context);
101
+ expect(selector.keySet.equals(context.selectorBits.getBitset(['foo', '>', '.a', '.b']))).toBe(true);
102
+ expect(selector.requiredKeySet.equals(context.selectorBits.getBitset(['foo', '>', '.a', '.b']))).toBe(true);
103
+ });
104
+
105
+ test('complex selector with :is(SelectorList) excludes alternatives from requiredKeySet', async () => {
106
+ // foo > :is(.a, .b) — :is has SelectorList arg, alternatives excluded
107
+ let selector = sel([el('foo'), co('>'), pseudo({ name: ':is', arg: sellist([el('.a'), el('.b')]) })]);
108
+ await selector.eval(context);
109
+ expect(selector.keySet.equals(context.selectorBits.getBitset(['foo', '>', '.a', '.b']))).toBe(true);
110
+ expect(selector.requiredKeySet.equals(context.selectorBits.getBitset(['foo', '>']))).toBe(true);
111
+ });
112
+ });
113
+
114
+ describe('Fast-reject in selectorMatch', () => {
115
+ let context: Context;
116
+ beforeEach(() => {
117
+ context = new Context();
118
+ });
119
+
120
+ test('evalContext-aware matcher can drive selector compare consumers when context is provided', () => {
121
+ const parent = ruleset({
122
+ selector: el('.alpha'),
123
+ rules: rules([])
124
+ });
125
+ const clonedParent = parent.clone(true);
126
+ clonedParent.get('selector').keySetLibrary = context.selectorBits;
127
+
128
+ const patched = el('.beta');
129
+ patched.keySetLibrary = context.selectorBits;
130
+
131
+ const find = sel([
132
+ amp({ selectorContainer: clonedParent as any }),
133
+ co('>'),
134
+ el('.tail')
135
+ ]);
136
+ find.keySetLibrary = context.selectorBits;
137
+ for (const child of find.get('value') as any[]) {
138
+ if ('keySetLibrary' in child) {
139
+ child.keySetLibrary = context.selectorBits;
140
+ }
141
+ }
142
+
143
+ const target = sel([el('.beta'), co('>'), el('.tail')]);
144
+ target.keySetLibrary = context.selectorBits;
145
+ for (const child of target.get('value') as any[]) {
146
+ if ('keySetLibrary' in child) {
147
+ child.keySetLibrary = context.selectorBits;
148
+ }
149
+ }
150
+
151
+ const findList = sellist([find]);
152
+ findList.keySetLibrary = context.selectorBits;
153
+
154
+ clonedParent.adopt(patched, context);
155
+ (clonedParent as unknown as { selector: ReturnType<typeof el> }).selector = patched;
156
+
157
+ expect(selectorMatch(find, target).fullMatch).toBe(false);
158
+ expect(selectorMatch(find, target, undefined, context).fullMatch).toBe(true);
159
+ expect(find.compare(target)).not.toBe(0);
160
+ expect(findList.compare(target)).not.toBe(0);
161
+ expect(find.compare(target, context)).toBe(0);
162
+ expect(findList.compare(target, context)).toBe(0);
163
+ });
164
+
165
+ test('evalContext-aware compare does not throw when find and target use different selector-bit libraries', () => {
166
+ const contextA = new Context();
167
+ const contextB = new Context();
168
+ const parent = ruleset({
169
+ selector: el('.alpha'),
170
+ rules: rules([])
171
+ });
172
+ const clonedParent = parent.clone(true);
173
+ clonedParent.get('selector').keySetLibrary = contextA.selectorBits;
174
+
175
+ const patched = el('.beta');
176
+ patched.keySetLibrary = contextA.selectorBits;
177
+
178
+ const find = sel([
179
+ amp({ selectorContainer: clonedParent as any }),
180
+ co('>'),
181
+ el('.tail')
182
+ ]);
183
+ find.keySetLibrary = contextB.selectorBits;
184
+ for (const child of find.get('value') as any[]) {
185
+ if ('keySetLibrary' in child) {
186
+ child.keySetLibrary = contextB.selectorBits;
187
+ }
188
+ }
189
+
190
+ const target = sel([el('.beta'), co('>'), el('.tail')]);
191
+ target.keySetLibrary = contextA.selectorBits;
192
+ for (const child of target.get('value') as any[]) {
193
+ if ('keySetLibrary' in child) {
194
+ child.keySetLibrary = contextA.selectorBits;
195
+ }
196
+ }
197
+
198
+ clonedParent.adopt(patched, contextA);
199
+ (clonedParent as unknown as { selector: ReturnType<typeof el> }).selector = patched;
200
+
201
+ expect(() => selectorMatch(find, target, undefined, contextA)).not.toThrow();
202
+ expect(selectorMatch(find, target, undefined, contextA).fullMatch).toBe(true);
203
+ expect(() => find.compare(target, contextA)).not.toThrow();
204
+ expect(find.compare(target, contextA)).toBe(0);
205
+ });
206
+
207
+ test('rejects completely disjoint simple selectors', async () => {
208
+ let find = el('.a');
209
+ let target = el('.b');
210
+ await find.eval(context);
211
+ await target.eval(context);
212
+ let result = selectorMatch(find, target);
213
+ expect(result.fullMatch).toBe(false);
214
+ expect(result.partialMatch).toBe(false);
215
+ });
216
+
217
+ test('rejects disjoint compound selectors', async () => {
218
+ let find = compound([el('.a'), el('.b')]);
219
+ let target = compound([el('.x'), el('.y')]);
220
+ await find.eval(context);
221
+ await target.eval(context);
222
+ let result = selectorMatch(find, target);
223
+ expect(result.fullMatch).toBe(false);
224
+ expect(result.partialMatch).toBe(false);
225
+ });
226
+
227
+ test('rejects disjoint complex selectors', async () => {
228
+ let find = sel([el('.a'), co('>'), el('.b')]);
229
+ let target = sel([el('.x'), co('>'), el('.y')]);
230
+ await find.eval(context);
231
+ await target.eval(context);
232
+ let result = selectorMatch(find, target);
233
+ expect(result.fullMatch).toBe(false);
234
+ expect(result.partialMatch).toBe(false);
235
+ });
236
+
237
+ test('rejects when :is(SelectorList) alternatives are all disjoint with target', async () => {
238
+ // find = :is(.a, .b), target = .x — no overlap at all
239
+ let find = pseudo({ name: ':is', arg: sellist([el('.a'), el('.b')]) });
240
+ let target = el('.x');
241
+ await find.eval(context);
242
+ await target.eval(context);
243
+ let result = selectorMatch(find, target);
244
+ expect(result.fullMatch).toBe(false);
245
+ expect(result.partialMatch).toBe(false);
246
+ });
247
+
248
+ test('does not reject when :is(SelectorList) has an alternative matching target', async () => {
249
+ // find = :is(.a, .b), target = .a — .a overlaps
250
+ let find = pseudo({ name: ':is', arg: sellist([el('.a'), el('.b')]) });
251
+ let target = el('.a');
252
+ await find.eval(context);
253
+ await target.eval(context);
254
+ let result = selectorMatch(find, target);
255
+ expect(result.fullMatch).toBe(true);
256
+ });
257
+
258
+ test('does not reject :is(compound) when target has matching keys', async () => {
259
+ // find = foo > :is(.a.b), target = .a.b — :is content keys are required and present
260
+ let find = sel([el('foo'), co('>'), pseudo({ name: ':is', arg: compound([el('.a'), el('.b')]) })]);
261
+ let target = compound([el('.b'), el('.a')]);
262
+ await find.eval(context);
263
+ await target.eval(context);
264
+ let result = selectorMatch(find, target);
265
+ expect(result.partialMatch).toBe(true);
266
+ });
267
+
268
+ test('does not reject :is(complex) when target has matching keys', async () => {
269
+ // find = .a > :is(.b > .c), target = .b > .c — :is content keys overlap
270
+ let find = sel([el('.a'), co('>'), pseudo({ name: ':is', arg: sel([el('.b'), co('>'), el('.c')]) })]);
271
+ let target = sel([el('.b'), co('>'), el('.c')]);
272
+ await find.eval(context);
273
+ await target.eval(context);
274
+ let result = selectorMatch(find, target);
275
+ expect(result.partialMatch).toBe(true);
276
+ });
277
+
278
+ test('rejects complex find with :is(SelectorList) when non-:is keys are disjoint', async () => {
279
+ // find = .x > :is(.a, .b), target = .y — requiredKeySet = {.x, >}, target has {.y}
280
+ // requiredKeySet is disjoint with target
281
+ let find = sel([el('.x'), co('>'), pseudo({ name: ':is', arg: sellist([el('.a'), el('.b')]) })]);
282
+ let target = el('.y');
283
+ await find.eval(context);
284
+ await target.eval(context);
285
+ let result = selectorMatch(find, target);
286
+ expect(result.fullMatch).toBe(false);
287
+ expect(result.partialMatch).toBe(false);
288
+ });
289
+
290
+ test('does not reject when target shares a key with :is(SelectorList) alternatives', async () => {
291
+ // find = .x > :is(.a, .b), target = .a — requiredKeySet = {.x, >} disjoint with {.a}
292
+ // BUT keySet = {.x, >, .a, .b} which shares .a — however requiredKeySet check rejects
293
+ // This is a known limitation: requiredKeySet disjoint can over-reject for SelectorList
294
+ // when no parent is provided and the partial match would go through alternatives only
295
+ let find = sel([el('.x'), co('>'), pseudo({ name: ':is', arg: sellist([el('.a'), el('.b')]) })]);
296
+ let target = el('.a');
297
+ await find.eval(context);
298
+ await target.eval(context);
299
+ let result = selectorMatch(find, target);
300
+ // requiredKeySet = {.x, >}, target.keySet = {.a} — disjoint → rejected
301
+ // In real extend processing, parent is provided so fast-reject is skipped
302
+ expect(result.fullMatch).toBe(false);
303
+ expect(result.partialMatch).toBe(false);
304
+ });
305
+
306
+ test('rejects compound find against target with no shared visible keys', async () => {
307
+ let find = compound([el('.a'), pseudo({ name: ':hover' })]);
308
+ let target = compound([el('.b'), pseudo({ name: ':focus' })]);
309
+ await find.eval(context);
310
+ await target.eval(context);
311
+ let result = selectorMatch(find, target);
312
+ expect(result.fullMatch).toBe(false);
313
+ expect(result.partialMatch).toBe(false);
314
+ });
315
+
316
+ test('does not reject compound find when target shares some keys', async () => {
317
+ let find = compound([el('.a'), pseudo({ name: ':hover' })]);
318
+ let target = compound([el('.a'), el('.b'), pseudo({ name: ':hover' })]);
319
+ await find.eval(context);
320
+ await target.eval(context);
321
+ let result = selectorMatch(find, target);
322
+ expect(result.partialMatch).toBe(true);
323
+ });
324
+
325
+ test('rejects nested :is(SelectorList) inside :is(SelectorList) when all disjoint', async () => {
326
+ // find = :is(:is(.a, .b), .c), target = .x
327
+ let find = pseudo({
328
+ name: ':is',
329
+ arg: sellist([
330
+ pseudo({ name: ':is', arg: sellist([el('.a'), el('.b')]) }),
331
+ el('.c')
332
+ ])
333
+ });
334
+ let target = el('.x');
335
+ await find.eval(context);
336
+ await target.eval(context);
337
+ let result = selectorMatch(find, target);
338
+ expect(result.fullMatch).toBe(false);
339
+ expect(result.partialMatch).toBe(false);
340
+ });
341
+
342
+ test('does not reject nested :is when target matches an inner alternative', async () => {
343
+ // find = :is(:is(.a, .b), .c), target = .b
344
+ let find = pseudo({
345
+ name: ':is',
346
+ arg: sellist([
347
+ pseudo({ name: ':is', arg: sellist([el('.a'), el('.b')]) }),
348
+ el('.c')
349
+ ])
350
+ });
351
+ let target = el('.b');
352
+ await find.eval(context);
353
+ await target.eval(context);
354
+ let result = selectorMatch(find, target);
355
+ expect(result.fullMatch).toBe(true);
356
+ });
357
+
358
+ test('rejects :where() with disjoint keys', async () => {
359
+ let find = pseudo({ name: ':where', arg: compound([el('.a'), el('.b')]) });
360
+ let target = el('.x');
361
+ await find.eval(context);
362
+ await target.eval(context);
363
+ let result = selectorMatch(find, target);
364
+ expect(result.fullMatch).toBe(false);
365
+ expect(result.partialMatch).toBe(false);
366
+ });
367
+
368
+ test('rejects :not() with disjoint keys', async () => {
369
+ let find = pseudo({ name: ':not', arg: el('.a') });
370
+ let target = pseudo({ name: ':not', arg: el('.b') });
371
+ await find.eval(context);
372
+ await target.eval(context);
373
+ let result = selectorMatch(find, target);
374
+ expect(result.fullMatch).toBe(false);
375
+ expect(result.partialMatch).toBe(false);
376
+ });
377
+ });
@@ -0,0 +1,63 @@
1
+ import { isNode } from '../is-node.js';
2
+ import { N } from '../../node-type.js';
3
+ import { el, sel, compound, co, sellist, pseudo } from '../../index.js';
4
+
5
+ describe('is-node', () => {
6
+ test('is a basic selector (bitmask)', () => {
7
+ let node = el('.foo');
8
+ expect(isNode(node, N.BasicSelector)).toBe(true);
9
+ /** Test the abstract parent mask */
10
+ expect(isNode(node, N.SimpleSelector)).toBe(true);
11
+ expect(isNode(node, N.Selector)).toBe(true);
12
+ /** Negative checks */
13
+ expect(isNode(node, N.PseudoSelector)).toBe(false);
14
+ expect(isNode(node, N.CompoundSelector)).toBe(false);
15
+ expect(isNode(node, N.Combinator)).toBe(false);
16
+ });
17
+
18
+ test('compound selector', () => {
19
+ let node = compound([el('.foo'), el('.bar')]);
20
+ expect(isNode(node, N.CompoundSelector)).toBe(true);
21
+ expect(isNode(node, N.Selector)).toBe(true);
22
+ expect(isNode(node, N.BasicSelector)).toBe(false);
23
+ expect(isNode(node, N.SimpleSelector)).toBe(false);
24
+ });
25
+
26
+ test('complex selector', () => {
27
+ let node = sel([el('.foo'), co('>'), el('.bar')]);
28
+ expect(isNode(node, N.ComplexSelector)).toBe(true);
29
+ expect(isNode(node, N.Selector)).toBe(true);
30
+ expect(isNode(node, N.CompoundSelector)).toBe(false);
31
+ });
32
+
33
+ test('combinator', () => {
34
+ let node = co('>');
35
+ expect(isNode(node, N.Combinator)).toBe(true);
36
+ expect(isNode(node, N.Selector)).toBe(true);
37
+ expect(isNode(node, N.BasicSelector)).toBe(false);
38
+ });
39
+
40
+ test('selector list', () => {
41
+ let node = sellist([el('.a'), el('.b')]);
42
+ expect(isNode(node, N.SelectorList)).toBe(true);
43
+ expect(isNode(node, N.Selector)).toBe(true);
44
+ expect(isNode(node, N.ComplexSelector)).toBe(false);
45
+ });
46
+
47
+ test('bitwise OR mask matches any included type', () => {
48
+ let basic = el('.foo');
49
+ let combinator = co('>');
50
+ let mask = N.BasicSelector | N.Combinator;
51
+ expect(isNode(basic, mask)).toBe(true);
52
+ expect(isNode(combinator, mask)).toBe(true);
53
+ expect(isNode(compound([el('.a'), el('.b')]), mask)).toBe(false);
54
+ });
55
+
56
+ test('isNode with no type arg is a type guard for Node', () => {
57
+ expect(isNode(el('.foo'))).toBe(true);
58
+ expect(isNode(null)).toBe(false);
59
+ expect(isNode(undefined)).toBe(false);
60
+ expect(isNode('string')).toBe(false);
61
+ expect(isNode(42)).toBe(false);
62
+ });
63
+ });
@@ -0,0 +1,63 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { Any, List, Sequence, Paren, Rules, decl } from '../../index.js';
3
+ import { coerceListItems, getListItems, isListContainer, iterateItems } from '../list-like.js';
4
+
5
+ describe('list-like utilities', () => {
6
+ it('detects direct list containers and unwraps a single paren layer', () => {
7
+ const list = new List([new Any('a'), new Any('b')]);
8
+ const seq = new Sequence([new Any('x'), new Any('y')]);
9
+ const parenList = new Paren(list);
10
+ const nestedParenList = new Paren(parenList);
11
+
12
+ expect(isListContainer(list)).toBe(true);
13
+ expect(isListContainer(seq)).toBe(true);
14
+ expect(isListContainer(parenList)).toBe(true);
15
+ expect(isListContainer(nestedParenList)).toBe(false);
16
+
17
+ expect(getListItems(list)?.map(item => item.valueOf())).toEqual(['a', 'b']);
18
+ expect(getListItems(seq)?.map(item => item.valueOf())).toEqual(['x', 'y']);
19
+ expect(getListItems(parenList)?.map(item => item.valueOf())).toEqual(['a', 'b']);
20
+ expect(getListItems(nestedParenList)).toBeUndefined();
21
+ });
22
+
23
+ it('coerces scalars to length-1 and preserves Less single-list-sequence normalization', () => {
24
+ const single = new Any('solo');
25
+ const innerSequence = new Sequence([new Any('a'), new Any('b')]);
26
+ const listWithSingleSequence = new List([innerSequence]);
27
+ const nestedParenList = new Paren(new Paren(new List([new Any('wrapped')])));
28
+ const nestedItems = coerceListItems(nestedParenList);
29
+
30
+ expect(coerceListItems(single).map(item => item.valueOf())).toEqual(['solo']);
31
+ expect(coerceListItems(listWithSingleSequence).map(item => item.valueOf())).toEqual(['a', 'b']);
32
+ expect(nestedItems).toHaveLength(1);
33
+ expect(nestedItems[0]).toBeInstanceOf(Paren);
34
+ expect(nestedItems[0]!.toString()).toBe('((wrapped))');
35
+ });
36
+
37
+ it('iterates items without flattening nested containers', () => {
38
+ const directParenList = new Paren(new List([new Any('a'), new Any('b')]));
39
+ const nestedParenList = new Paren(new Paren(new List([new Any('wrapped')])));
40
+ const rules = new Rules([
41
+ decl({ name: 'one', value: new Any('red') }),
42
+ decl({ name: 'two', value: new Any('blue') })
43
+ ]);
44
+
45
+ const directEntries: Array<[string, number | string]> = [];
46
+ for (const [value, key] of iterateItems(directParenList)) {
47
+ directEntries.push([value.valueOf(), key as number | string]);
48
+ }
49
+ expect(directEntries).toEqual([['a', 0], ['b', 1]]);
50
+
51
+ const nestedEntries: Array<[string, number | string]> = [];
52
+ for (const [value, key] of iterateItems(nestedParenList)) {
53
+ nestedEntries.push([value.toString(), key as number | string]);
54
+ }
55
+ expect(nestedEntries).toEqual([['((wrapped))', 0]]);
56
+
57
+ const ruleEntries: Array<[string, string]> = [];
58
+ for (const [value, key] of iterateItems(rules)) {
59
+ ruleEntries.push([value.valueOf(), String(key.valueOf())]);
60
+ }
61
+ expect(ruleEntries).toEqual([['red', 'one'], ['blue', 'two']]);
62
+ });
63
+ });