garden
garden copied to clipboard
garden.selectors broken in v2.0.0
Whenever selectors/& is used an exception is raised: Assert failed: (vector? tagged-data)
Using the vector-form works [:&:.foo], but as far as I know, that can not be combined with other selector-fns like selectors/+ etc.
Yes. The selectors namespace has not been updated with an implementation of garden.parse/IParse for CSSSelector. That is the reason you are seeing an exception.
Does that mean, that it's not possible to express this selector at the moment? Or is there some other way around it?
[(selector/& (selector/not :Vertically)) {:flex-direction :row}]
@hkjels No but I think we can resolve this problem by defining and implementation of garden.parse/IParse for the garden.selectors.CSSSelector class. That implementation could return a new AST node type of :css.selector/raw which would just be a string.
In selectors.cljs:
(defrecord CSSSelector [selector]
garden.parse/IParse
(-parse [this]
[:css.selector/raw (css-selector this)]))
and in parse.cljc we'd have
(spec/def ::raw-selector
string?)
(spec/def ::selector
(spec/or ::simple-selector ::simple-selector
::compound-selector ::compound-selector
::complex-selector ::complex-selector
::raw-selector ::raw-selector)) ;; Support "raw" selectors but only at the top.
We'd then need to add a method for it in normalize.cljc and compiler.cljc.
This isn't a great solution though because it makes the resolution of nested selectors during the normalization process much more complex.
A better alternative would be to parse the result of calling css-selector and return a selector AST that fits in with what currently exists e.g. a :css.selector/complex node, etc. Since there's existing code which already does some lightweight analysis of CSS selector syntax, I think this would be the best direction to go.
See #137
@hkjels Apologies for thinking out loud. The game plan will be to implement a parser for the CSS selector syntax and use that in the implementation of garden.parse/IParse for the garden.selector.CSSSelector class.
Hey, don't apologise. I love it! 👍 I don't quite follow you, but I'll look into it and see if I can grasp what your saying here :)