Fork me on GitHub
#squint
<
2023-12-14
>
escherize04:12:43

I am trying to use alpine.js, with squint. I can get it working by embedding strings of js (:face_vomiting:) in my hiccup. Some things require json (which is easy to produce) and others require some plain js expressions. e.g. just: “count--“. Can I produce an analog with squint? Fuller example in 🧵

escherize04:12:32

This is a counter component in hiccup (https://github.com/escherize/huff actually), no processing going on:

(defn counter []
  [:div {:x-data "{\"count\":0}"}
   [:button {:x-on:click "count--"} "Decrement"]
   [:button {:x-on:click "count++"} "Increment"]
   [:h1 {:x-text "count"}]
   [:div {:x-data "{\"words\":[\"Once\",\"upon\",\"a\",\"time,\"]}"
          :x-text "words[count]"}]])

escherize04:12:59

Same thing, with the json removed

(defn counter-json []
  [:div {:x-data {:count 0}}
   [:button {:x-on:click "count--"} "Decrement"]
   [:button {:x-on:click "count++"} "Increment"]
   [:h1 {:x-text "count"}]
   [:div {:x-data (j {:words ["Once" "upon" "a" "time"]})
          :x-text "words[count]"}]])

escherize04:12:00

What I’d like to use:

(defn counter-want-one []
  [:div {:x-data {:count 0}}
   [:button {:x-on:click (compile
                           (fn [{:keys [count]}]
                             (set! count (dec count))))} "Decrement"]
   [:button {:x-on:click (compile
                           (fn [{:keys [count]}]
                             (set! count (inc count))))} "Increment"]
   [:h1 {:x-text "count"}]
   [:div {:x-data (j {:words ["Once" "upon" "a" "time"]})
          :x-text "words[count]"}]])

escherize04:12:48

or maybe

...
[:button {:x-on:click (alpine/update! :count inc)} "Increment"]
...

zane05:12:51

I had the same idea. Should be straightforward!

borkdude07:12:40

let's have a look

borkdude08:12:00

I made a bb hiccup example here with inline JS here: https://github.com/squint-cljs/squint/blob/main/examples/babashka/index.clj I'm not sure what the added value of squint + alpine.js is

gratitude-thank-you 1
borkdude11:12:35

I've got this working now:

[:body
                   [:div {:x-data (->js '{:counter 0})}
                    [:button {:x-on:click (->js '(set! counter (inc counter)))}
                     "Increment"]
                    [:span {:x-text "counter"}]]]

borkdude12:12:36

ok, this is what I've got right now: https://github.com/squint-cljs/squint/blob/main/examples/babashka/alpinejs.clj one problem is that when you remove the non-atom counter from x-text, you don't get a re-render

borkdude12:12:46

I get it, it does a reference check on the data

borkdude12:12:51

and the atom ref doesn't change

Lari Saukkonen16:12:02

Using squint with Next.js seems to work nicely. Only one issue, for pure client components one option is to write “use client” on the first line but since squint imports itself on the first line it cannot be done. There are ways around that tho.

borkdude17:12:49

Good to hear! We can try to accommodate this better. I had similar problems with getting js-doc to work and putting a // ts-check on the first line

borkdude17:12:52

issue welcome

borkdude20:12:28

I think it should work now with 0.4.82

Lari Saukkonen06:12:43

That was fast! I will try out today. :sports_medal:

Lari Saukkonen13:12:40

Works fine. Thank you!

borkdude13:12:47

🎉 Curious about an example next.js project, if you want to create one in the examples dir in the repo, feel free :)

borkdude13:12:52

And if you have more issues, let me know

Lari Saukkonen17:12:49

Yeah sure. I think it would add some value. 👍

borkdude17:12:05

https://squint-cljs.github.io/squint/?src=KHJlcXVpcmUgJ1sicmVhY3QiIDphcyByZWFjdF0pCihyZXF1aXJlICdbInJlYWN0LWRvbSIgOmFzIHJkb21dKQoKKGRlZiBlbXB0eS1ib2FyZCBbW1wtIFwtIFwtXQogICAgICAgICAgICAgICAgICBbXC0gXC0gXC1dCiAgICAgICAgICAgICAgICAgIFtcLSBcLSBcLV1dKQoKKGRlZiBpbml0LXN0YXRlIHs6Ym9hcmQgZW1wdHktYm9hcmQgOnBsYXllciBcWH0pCgooZGVmbiBnZXQtYm9hcmQtY2VsbAogIChbYm9hcmQgcm93IGNvbF0KICAgKGdldC1pbiBib2FyZCBbcm93IGNvbF0pKSkKCihkZWZuIGdldC1wbGF5ZXIgW2FwcC1zdGF0ZV0KICAoLT4gYXBwLXN0YXRlIDpnYW1lLXN0YXRlIDpwbGF5ZXIpKQoKKGRlZm4gb3RoZXItcGxheWVyIFtwbGF5ZXJdCiAgKGlmICg9IHBsYXllciBcWCkgXE8gXFgpKQoKKGRlZm4gd2lubmVyLWluLXJvd3M%2FIFtib2FyZCBwbGF5ZXJdCiAgKHNvbWUgKGZuIFtyb3ddIChldmVyeT8gKGZuIFtjXSAoPSBjIHBsYXllcikpIHJvdykpIGJvYXJkKSkKCihkZWZuIHRyYW5zcG9zZWQtYm9hcmQgW2JvYXJkXQogICh2ZWMgKGFwcGx5IG1hcCB2ZWN0b3IgYm9hcmQpKSkKCihkZWZuIHdpbm5lci1pbi1jb2xzPyBbYm9hcmQgcGxheWVyXQogICh3aW5uZXItaW4tcm93cz8gKHRyYW5zcG9zZWQtYm9hcmQgYm9hcmQpIHBsYXllcikpCgooZGVmbiB3aW5uZXItaW4tZGlhZ29uYWxzPyBbYm9hcmQgcGxheWVyXQogIChsZXQgW2RpYWctY29vcmRzIFtbWzAgMF0gWzEgMV0gWzIgMl1dCiAgICAgICAgICAgICAgICAgICAgIFtbMCAyXSBbMSAxXSBbMiAwXV1dXQogICAgKHNvbWUgKGZuIFtjb29yZHNdCiAgICAgICAgICAgIChldmVyeT8gKGZuIFtjb29yZF0KICAgICAgICAgICAgICAgICAgICAgICg9IHBsYXllciAoYXBwbHkgZ2V0LWJvYXJkLWNlbGwgYm9hcmQgY29vcmQpKSkKICAgICAgICAgICAgICBjb29yZHMpKQogICAgICBkaWFnLWNvb3JkcykpKQoKKGRlZm4gd2lubmVyCiAgImNoZWNrcyBpZiB0aGVyZSBpcyBhIHdpbm5lci4gd2hlbiBjYWxsZWQgd2l0aCBubyBhcmdzLCBjaGVja3MgZm9yIHBsYXllciBYIGFuZCBwbGF5ZXIgTy4KcmV0dXJucyB0aGUgY2hhcmFjdGVyIGZvciB0aGUgd2lubmluZyBwbGF5ZXIsIG5pbCBpZiB0aGVyZSBpcyBubyB3aW5uZXIiCiAgKFtib2FyZF0KICAgKG9yICh3aW5uZXIgYm9hcmQgXFgpCiAgICAgKHdpbm5lciBib2FyZCBcTykpKQogIChbYm9hcmQgcGxheWVyXQogICAoaWYgKG9yICh3aW5uZXItaW4tcm93cz8gYm9hcmQgcGxheWVyKQogICAgICAgICAod2lubmVyLWluLWNvbHM%2FIGJvYXJkIHBsYXllcikKICAgICAgICAgKHdpbm5lci1pbi1kaWFnb25hbHM%2FIGJvYXJkIHBsYXllcikpCiAgICAgcGxheWVyKSkpCgooZGVmbiBmdWxsLWJvYXJkPwogIFtib2FyZF0KICAobGV0IFthbGwtY2VsbHMgKGFwcGx5IGNvbmNhdCBib2FyZCldCiAgICAobm90LWFueT8gIyg9ICUgXC0pIGFsbC1jZWxscykpKQoKKGRlZm4gbmV3LXN0YXRlIFtyb3cgY29sIG9sZC1zdGF0ZV0KICAoaWYgKGFuZCAoPSAoZ2V0LWJvYXJkLWNlbGwgKDpib2FyZCBvbGQtc3RhdGUpIHJvdyBjb2wpIFwtKQogICAgICAgIChub3QgKHdpbm5lciAoOmJvYXJkIG9sZC1zdGF0ZSkpKSkKICAgIHs6Ym9hcmQgKGFzc29jLWluICg6Ym9hcmQgb2xkLXN0YXRlKSBbcm93IGNvbF0gKDpwbGF5ZXIgb2xkLXN0YXRlKSkKICAgICA6cGxheWVyIChvdGhlci1wbGF5ZXIgKDpwbGF5ZXIgb2xkLXN0YXRlKSl9CiAgICBvbGQtc3RhdGUpKQoKKGRlZm4gYm9hcmQgW10KICAobGV0IFtbc3RhdGUgc2V0U3RhdGVdIChyZWFjdC91c2VTdGF0ZSBpbml0LXN0YXRlKQogICAgICAgIHs6a2V5cyBbcGxheWVyIGJvYXJkXX0gc3RhdGVdCiAgICAjanN4CiAgICBbOmRpdiB7OmtleSAid2lubmVyIn0KICAgICAoc3RyICJUaGUgd2lubmVyIGlzICIgKHdpbm5lciBib2FyZCkpCiAgICAgWzpkaXYgezprZXkgImdhbWUiCiAgICAgICAgICAgIDpzdHlsZSB7OmNvbG9yICIjNjY2In19CiAgICAgIFs6dGFibGUKICAgICAgIChmb3IgW2kgKHJhbmdlIDAgMyldCiAgICAgICAgICNqc3gKICAgICAgICAgICBbOnRyIHs6a2V5IGl9CiAgICAgICAgICAgIChmb3IgW2ogKHJhbmdlIDAgMyldCiAgICAgICAgICAgICAgI2pzeCBbOnRkIHs6a2V5IGoKICAgICAgICAgICAgICAgICAgICAgICAgIDpzdHlsZSB7OmJvcmRlciAiMXB4IHNvbGlkICNkZWRlZGUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDptYXJnaW4gIjFweCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmhlaWdodCAiNTBweCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOndpZHRoICI1MHB4IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGluZS1oZWlnaHQiICI1MHB4IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dC1hbGlnbiIgImNlbnRlciIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhY2tncm91bmQiICIjZmZmIn0KICAgICAgICAgICAgICAgICAgICAgICAgIDpvbkNsaWNrCiAgICAgICAgICAgICAgICAgICAgICAgICAoZm4gW19dCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZiAoYW5kICg9ICItIiAoZ2V0LWluIGJvYXJkIFtpIGpdKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5vdCAod2lubmVyIGJvYXJkKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5vdCAoZnVsbC1ib2FyZD8gYm9hcmQpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2V0U3RhdGUgKC0%2BCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXBkYXRlIDpwbGF5ZXIgb3RoZXItcGxheWVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1cGRhdGUgOmJvYXJkIGFzc29jLWluIFtpIGpdIHBsYXllcikpKSkpfQogICAgICAgICAgICAgICAgICAgIChnZXQtaW4gYm9hcmQgW2kgal0pXSldKV1dXSkpCgooZGVmbiByZW5kZXItYm9hcmQgW10KICAobGV0IFtlbHQgKG9yIChqcy9kb2N1bWVudC5nZXRFbGVtZW50QnlJZCAiYm9hcmQiKQogICAgICAgICAgICAgIChkb3RvIChqcy9kb2N1bWVudC5jcmVhdGVFbGVtZW50ICJkaXYiKQogICAgICAgICAgICAgICAgKHNldCEgLWlkICJib2FyZCIpCiAgICAgICAgICAgICAgICAoanMvZG9jdW1lbnQuYm9keS5wcmVwZW5kKSkpCiAgICAgICAgcm9vdCAocmRvbS9jcmVhdGVSb290IGVsdCldCiAgICAoLnJlbmRlciByb290ICNqc3ggW2JvYXJkXSkpKQoKKGRlZm9uY2UgZm9vIChkbyAocmVuZGVyLWJvYXJkKSB0cnVlKSk%3D (the styling sucks, sorry, port from an old game)

👀 1
borkdude18:12:37

https://squint-cljs.github.io/squint/?src=KHJlcXVpcmUgJ1sicmVhY3QiIDphcyByZWFjdF0pCihyZXF1aXJlICdbInJlYWN0LWRvbSIgOmFzIHJkb21dKQoKKGRlZiBlbXB0eS1ib2FyZCBbW1wtIFwtIFwtXQogICAgICAgICAgICAgICAgICBbXC0gXC0gXC1dCiAgICAgICAgICAgICAgICAgIFtcLSBcLSBcLV1dKQoKKGRlZiBpbml0LXN0YXRlIHs6Ym9hcmQgZW1wdHktYm9hcmQgOnBsYXllciBcWH0pCgooZGVmbiBnZXQtYm9hcmQtY2VsbAogIChbYm9hcmQgcm93IGNvbF0KICAgKGdldC1pbiBib2FyZCBbcm93IGNvbF0pKSkKCihkZWZuIGdldC1wbGF5ZXIgW2FwcC1zdGF0ZV0KICAoLT4gYXBwLXN0YXRlIDpnYW1lLXN0YXRlIDpwbGF5ZXIpKQoKKGRlZm4gb3RoZXItcGxheWVyIFtwbGF5ZXJdCiAgKGlmICg9IHBsYXllciBcWCkgXE8gXFgpKQoKKGRlZm4gd2lubmVyLWluLXJvd3M%2FIFtib2FyZCBwbGF5ZXJdCiAgKHNvbWUgKGZuIFtyb3ddIChldmVyeT8gKGZuIFtjXSAoPSBjIHBsYXllcikpIHJvdykpIGJvYXJkKSkKCihkZWZuIHRyYW5zcG9zZWQtYm9hcmQgW2JvYXJkXQogICh2ZWMgKGFwcGx5IG1hcCB2ZWN0b3IgYm9hcmQpKSkKCihkZWZuIHdpbm5lci1pbi1jb2xzPyBbYm9hcmQgcGxheWVyXQogICh3aW5uZXItaW4tcm93cz8gKHRyYW5zcG9zZWQtYm9hcmQgYm9hcmQpIHBsYXllcikpCgooZGVmbiB3aW5uZXItaW4tZGlhZ29uYWxzPyBbYm9hcmQgcGxheWVyXQogIChsZXQgW2RpYWctY29vcmRzIFtbWzAgMF0gWzEgMV0gWzIgMl1dCiAgICAgICAgICAgICAgICAgICAgIFtbMCAyXSBbMSAxXSBbMiAwXV1dXQogICAgKHNvbWUgKGZuIFtjb29yZHNdCiAgICAgICAgICAgIChldmVyeT8gKGZuIFtjb29yZF0KICAgICAgICAgICAgICAgICAgICAgICg9IHBsYXllciAoYXBwbHkgZ2V0LWJvYXJkLWNlbGwgYm9hcmQgY29vcmQpKSkKICAgICAgICAgICAgICBjb29yZHMpKQogICAgICBkaWFnLWNvb3JkcykpKQoKKGRlZm4gd2lubmVyCiAgImNoZWNrcyBpZiB0aGVyZSBpcyBhIHdpbm5lci4gd2hlbiBjYWxsZWQgd2l0aCBubyBhcmdzLCBjaGVja3MgZm9yIHBsYXllciBYIGFuZCBwbGF5ZXIgTy4KcmV0dXJucyB0aGUgY2hhcmFjdGVyIGZvciB0aGUgd2lubmluZyBwbGF5ZXIsIG5pbCBpZiB0aGVyZSBpcyBubyB3aW5uZXIiCiAgKFtib2FyZF0KICAgKG9yICh3aW5uZXIgYm9hcmQgXFgpCiAgICAgKHdpbm5lciBib2FyZCBcTykpKQogIChbYm9hcmQgcGxheWVyXQogICAoaWYgKG9yICh3aW5uZXItaW4tcm93cz8gYm9hcmQgcGxheWVyKQogICAgICAgICAod2lubmVyLWluLWNvbHM%2FIGJvYXJkIHBsYXllcikKICAgICAgICAgKHdpbm5lci1pbi1kaWFnb25hbHM%2FIGJvYXJkIHBsYXllcikpCiAgICAgcGxheWVyKSkpCgooZGVmbiBmdWxsLWJvYXJkPwogIFtib2FyZF0KICAobGV0IFthbGwtY2VsbHMgKGFwcGx5IGNvbmNhdCBib2FyZCldCiAgICAobm90LWFueT8gIyg9ICUgXC0pIGFsbC1jZWxscykpKQoKKGRlZm4gbmV3LXN0YXRlIFtyb3cgY29sIG9sZC1zdGF0ZV0KICAoaWYgKGFuZCAoPSAoZ2V0LWJvYXJkLWNlbGwgKDpib2FyZCBvbGQtc3RhdGUpIHJvdyBjb2wpIFwtKQogICAgICAgIChub3QgKHdpbm5lciAoOmJvYXJkIG9sZC1zdGF0ZSkpKSkKICAgIHs6Ym9hcmQgKGFzc29jLWluICg6Ym9hcmQgb2xkLXN0YXRlKSBbcm93IGNvbF0gKDpwbGF5ZXIgb2xkLXN0YXRlKSkKICAgICA6cGxheWVyIChvdGhlci1wbGF5ZXIgKDpwbGF5ZXIgb2xkLXN0YXRlKSl9CiAgICBvbGQtc3RhdGUpKQoKKGRlZm4gYm9hcmQgW10KICAobGV0IFtbc3RhdGUgc2V0U3RhdGVdIChyZWFjdC91c2VTdGF0ZSBpbml0LXN0YXRlKQogICAgICAgIHs6a2V5cyBbcGxheWVyIGJvYXJkXX0gc3RhdGVdCiAgICAjanN4CiAgICBbOmRpdiB7OmtleSAid2lubmVyIn0KICAgICAoc3RyICJUaGUgd2lubmVyIGlzICIgKHdpbm5lciBib2FyZCkpCiAgICAgWzpkaXYgezprZXkgImdhbWUiCiAgICAgICAgICAgIDpzdHlsZSB7OmNvbG9yICIjNjY2IgogICAgICAgICAgICAgICAgICAgIDpmb250LWZhbWlseSAiQXJpYWwifX0KICAgICAgWzp0YWJsZSB7OnN0eWxlIHs6d2lkdGggImF1dG8ifX0KICAgICAgIChmb3IgW2kgKHJhbmdlIDAgMyldCiAgICAgICAgICNqc3gKICAgICAgICAgICBbOnRyIHs6a2V5IGl9CiAgICAgICAgICAgIChmb3IgW2ogKHJhbmdlIDAgMyldCiAgICAgICAgICAgICAgI2pzeCBbOnRkIHs6a2V5IGoKICAgICAgICAgICAgICAgICAgICAgICAgIDpzdHlsZSB7OnBhZGRpbmcgIjFweCJ9fQogICAgICAgICAgICAgICAgICAgIFs6ZGl2IHsKICAgICAgICAgICAgICAgICAgICAgICAgIDpzdHlsZSB7OmJvcmRlciAiMXB4IHNvbGlkICNkZWRlZGUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDptYXJnaW4gIjFweCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmhlaWdodCAiNTBweCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOndpZHRoICI1MHB4IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6bGluZS1oZWlnaHQgIjUwcHgiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp0ZXh0LWFsaWduICJjZW50ZXIifQogICAgICAgICAgICAgICAgICAgICAgICAgOm9uQ2xpY2sKICAgICAgICAgICAgICAgICAgICAgICAgIChmbiBbX10KICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmIChhbmQgKD0gIi0iIChnZXQtaW4gYm9hcmQgW2kgal0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobm90ICh3aW5uZXIgYm9hcmQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobm90IChmdWxsLWJvYXJkPyBib2FyZCkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZXRTdGF0ZSAoLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1cGRhdGUgOnBsYXllciBvdGhlci1wbGF5ZXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVwZGF0ZSA6Ym9hcmQgYXNzb2MtaW4gW2kgal0gcGxheWVyKSkpKSl9CiAgICAgICAgICAgICAgICAgICAgIChnZXQtaW4gYm9hcmQgW2kgal0pXV0pXSldXV0pKQoKKGRlZm4gcmVuZGVyLWJvYXJkIFtdCiAgKGxldCBbZWx0IChvciAoanMvZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQgImJvYXJkIikKICAgICAgICAgICAgICAoZG90byAoanMvZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAiZGl2IikKICAgICAgICAgICAgICAgIChzZXQhIC1pZCAiYm9hcmQiKQogICAgICAgICAgICAgICAgKGpzL2RvY3VtZW50LmJvZHkucHJlcGVuZCkpKQogICAgICAgIHJvb3QgKHJkb20vY3JlYXRlUm9vdCBlbHQpXQogICAgKC5yZW5kZXIgcm9vdCAjanN4IFtib2FyZF0pKSkKCihyZW5kZXItYm9hcmQp