{"id":13568465,"url":"https://github.com/squint-cljs/squint","last_synced_at":"2025-05-15T13:06:15.565Z","repository":{"id":56755349,"uuid":"524398721","full_name":"squint-cljs/squint","owner":"squint-cljs","description":"Light-weight ClojureScript dialect","archived":false,"fork":false,"pushed_at":"2025-05-03T14:53:54.000Z","size":2439,"stargazers_count":746,"open_issues_count":19,"forks_count":50,"subscribers_count":15,"default_branch":"main","last_synced_at":"2025-05-03T15:32:16.056Z","etag":null,"topics":["clojure","clojurescript","javascript"],"latest_commit_sha":null,"homepage":"https://squint-cljs.github.io/squint","language":"Clojure","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/squint-cljs.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"github":"borkdude"}},"created_at":"2022-08-13T12:52:45.000Z","updated_at":"2025-05-02T14:26:35.000Z","dependencies_parsed_at":"2024-04-15T12:51:33.780Z","dependency_job_id":"d6de5dd1-777b-4f72-9bae-3268a1d95e65","html_url":"https://github.com/squint-cljs/squint","commit_stats":null,"previous_names":[],"tags_count":141,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/squint-cljs%2Fsquint","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/squint-cljs%2Fsquint/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/squint-cljs%2Fsquint/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/squint-cljs%2Fsquint/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/squint-cljs","download_url":"https://codeload.github.com/squint-cljs/squint/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254346624,"owners_count":22055808,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["clojure","clojurescript","javascript"],"created_at":"2024-08-01T14:00:26.289Z","updated_at":"2025-05-15T13:06:15.556Z","avatar_url":"https://github.com/squint-cljs.png","language":"Clojure","readme":"\u003cimg src=\"./logo/logo.svg\" width=\"100%\"\u003e\n\nSquint is a light-weight dialect of ClojureScript with a compiler and standard\nlibrary.\n\nSquint is not intended as a full replacement for ClojureScript but as a tool to\ntarget JS when you need something more light-weight in terms of interop and\nbundle size. The most significant difference with CLJS is that squint uses only\nbuilt-in JS data structures. Squint's output is designed to work well with ES\nmodules.\n\nIf you want to use squint, but with the normal ClojureScript standard library\nand data structures, check out [cherry](https://github.com/squint-cljs/cherry).\n\n\u003e :warning: This project is a work in progress and may still undergo breaking\n\u003e changes.\n\n## Quickstart\n\nAlthough it's early days, you're welcome to try out `squint` and submit issues.\n\n``` shell\n$ mkdir squint-test \u0026\u0026 cd squint-test\n$ npm init -y\n$ npm install squint-cljs@latest\n```\n\nCreate a `.cljs` file, e.g. `example.cljs`:\n\n``` clojure\n(ns example\n  (:require [\"fs\" :as fs]\n            [\"url\" :refer [fileURLToPath]]))\n\n(println (fs/existsSync (fileURLToPath js/import.meta.url)))\n\n(defn foo [{:keys [a b c]}]\n  (+ a b c))\n\n(println (foo {:a 1 :b 2 :c 3}))\n```\n\nThen compile and run (`run` does both):\n\n```\n$ npx squint run example.cljs\ntrue\n6\n```\n\nRun `npx squint --help` to see all command line options.\n\n## Why Squint\n\nSquint lets you write CLJS syntax but emits small JS output, while still having\nparts of the CLJS standard library available (ported to mutable data structures,\nso with caveats). This may work especially well for projects e.g. that you'd\nlike to deploy on CloudFlare workers, node scripts, Github actions, etc. that\nneed the extra performance, startup time and/or small bundle size.\n\n## Talk\n\n[![ClojureScript re-imagined at Dutch Clojure Days 2022](https://img.youtube.com/vi/oCd74TQ-gf4/0.jpg)](https://www.youtube.com/watch?v=oCd74TQ-gf4)\n\n([slides](https://www.dropbox.com/s/955jgzy6hgpx67r/dcd2022-cljs-reimagined.pdf?dl=0))\n\n## Differences with ClojureScript\n\n- The CLJS standard library is replaced with `\"squint-cljs/core.js\"`, a smaller re-implemented subset\n- Keywords are translated into strings\n- Maps, sequences and vectors are represented as mutable objects and arrays\n- Standard library functions never mutate arguments if the CLJS counterpart do\n  not do so. Instead, shallow cloning is used to produce new values, a pattern that JS developers\n  nowadays use all the time: `const x = [...y];`\n- Most functions return arrays, objects or `Symbol.iterator`, not custom data structures\n- Functions like `map`, `filter`, etc. produce lazy iterable values but their\n  results are not cached. If side effects are used in combination with laziness,\n  it's recommended to realize the lazy value using `vec` on function\n  boundaries. You can detect re-usage of lazy values by calling\n  `warn-on-lazy-reusage!`.\n- Supports async/await:`(def x (js-await y))`. Async functions must be marked\n  with `^:async`: `(defn ^:async foo [])`.\n- `assoc!`, `dissoc!`, `conj!`, etc. perform in place mutation on objects\n- `assoc`, `dissoc`, `conj`, etc. return a new shallow copy of objects\n- `println` is a synonym for `console.log`\n- `pr-str` and `prn` coerce values to a string using `JSON.stringify` (currently, this may change)\n- Since JavaScript only supports strings for keys in maps, any data structures used as keys will be stringified\n\nIf you are looking for closer ClojureScript semantics, take a look at [Cherry 🍒](https://github.com/squint-cljs/cherry).\n\n## Articles\n\n- [Writing a Cloudflare worker with squint and bun](https://blog.michielborkent.nl/squint-cloudflare-bun.html)\n- [Porting a CLJS project to squint](https://blog.michielborkent.nl/porting-cljs-project-to-squint.html)\n\n## Projects using squint\n\n- [@nextjournal/clojure-mode](https://github.com/nextjournal/clojure-mode)\n- [static search index for Tumblr](https://github.com/holyjak/clj-tumblr-summarizer/commit/a8b2ca8a9f777e4a9059fa0f1381ded24e5f1a0f)\n- [wordle](https://github.com/jackdbd/squint-wordle)\n- [Zenith](https://tofutheloafu.itch.io/zenith): a game developed for the Lisp Game Jame 2024 by Trevor\n- [hiccupad](https://brianium.github.io/hiccupad/) ([source](https://github.com/brianium/hiccupad))\n\n## Advent of Code\n\nSolve [Advent of Code](https://adventofcode.com/) puzzles with squint [here](https://squint-cljs.github.io/squint/?src=OzsgSGVscGVyIGZ1bmN0aW9uczoKOzsgKGZldGNoLWlucHV0IHllYXIgZGF5KSAtIGdldCBBT0MgaW5wdXQKOzsgKGFwcGVuZCBzdHIpIC0gYXBwZW5kIHN0ciB0byBET00KOzsgKHNweSB4KSAtIGxvZyB4IHRvIGNvbnNvbGUgYW5kIHJldHVybiB4Cgo7OyBSZW1lbWJlciB0byB1cGRhdGUgdGhlIHllYXIgYW5kIGRheSBpbiB0aGUgZmV0Y2gtaW5wdXQgY2FsbC4KKGRlZiBpbnB1dCAoLT4%2BIChqcy1hd2FpdCAoZmV0Y2gtaW5wdXQgMjAyMiAxKSkKICAgICAgICAgICAgICNfc3B5CiAgICAgICAgICAgICBzdHIvc3BsaXQtbGluZXMKICAgICAgICAgICAgIChtYXB2IHBhcnNlLWxvbmcpKSkKCihkZWZuIHBhcnQtMQogIFtdCiAgKC0%2BPiBpbnB1dAogICAgKHBhcnRpdGlvbi1ieSBuaWw%2FKQogICAgKHRha2UtbnRoIDIpCiAgICAobWFwICMoYXBwbHkgKyAlKSkKICAgIChhcHBseSBtYXgpKSkKCihkZWZuIHBhcnQtMgogIFtdCiAgKC0%2BPiBpbnB1dAogICAgKHBhcnRpdGlvbi1ieSBuaWw%2FKQogICAgKHRha2UtbnRoIDIpCiAgICAobWFwICMoYXBwbHkgKyAlKSkKICAgIChzb3J0LWJ5IC0pCiAgICAodGFrZSAzKQogICAgKGFwcGx5ICspKSkKCih0aW1lIChwYXJ0LTEpKQojXyh0aW1lIChwYXJ0LTIpKQ%3D%3D\u0026boilerplate=https%3A%2F%2Fgist.githubusercontent.com%2Fborkdude%2Fcf94b492d948f7f418aa81ba54f428ff%2Fraw%2Fa6e9992b079e20e21d753e8c75a7353c5908b225%2Faoc_ui.cljs\u0026repl=true).\n\n### Seqs\n\nSquint does not implement Clojure seqs. Instead it uses the JavaScript\n[iteration\nprotocols](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols)\nto work with collections. What this means in practice is the following:\n\n- `seq` takes a collection and returns an Iterable of that collection, or nil if it's empty\n- `iterable` takes a collection and returns an Iterable of that collection, even if it's empty\n- `seqable?` can be used to check if you can call either one\n\nMost collections are iterable already, so `seq` and `iterable` will simply\nreturn them; an exception are objects created via `{:a 1}`, where `seq` and\n`iterable` will return the result of `Object.entries`.\n\n`first`, `rest`, `map`, `reduce` et al. call `iterable` on the collection before\nprocessing, and functions that typically return seqs instead return an array of\nthe results.\n\n#### Memory usage\n\nWith respect to memory usage:\n\n- Lazy seqs in squint are built on generators. They do not cache their results, so every time they are consumed, they are re-calculated from scratch.\n- Lazy seq function results hold on to their input, so if the input contains resources that should be garbage collected, it is recommended to limit their scope and convert their results to arrays when leaving the scope:\n\n\n``` clojure\n(js/global.gc)\n\n(println (js/process.memoryUsage))\n\n(defn doit []\n  (let [x [(-\u003e (new Array 10000000)\n               (.fill 0)) :foo :bar]\n        ;; Big array `x` is still being held on to by `y`:\n        y (rest x)]\n    (println (js/process.memoryUsage))\n    (vec y)))\n\n(println (doit))\n\n(js/global.gc)\n;; Note that big array is garbage collected now:\n(println (js/process.memoryUsage))\n```\n\nRun the above program with `node --expose-gc ./node_cli mem.cljs`\n\n## JSX\n\nYou can produce JSX syntax using the `#jsx` tag:\n\n``` clojure\n#jsx [:div \"Hello\"]\n```\n\nproduces:\n\n``` html\n\u003cdiv\u003eHello\u003c/div\u003e\n```\n\nand outputs the `.jsx` extension automatically.\n\nYou can use Clojure expressions within `#jsx` expressions:\n\n``` clojure\n(let [x 1] #jsx [:div (inc x)])\n```\n\nNote that when using a Clojure expression, you escape the JSX context so when you need to return more JSX, use the `#jsx` once again:\n\n``` clojure\n(let [x 1]\n  #jsx [:div\n         (if (odd? x)\n           #jsx [:span \"Odd\"]\n           #jsx [:span \"Even\"])])\n```\n\nTo pass props, you can use `:\u0026`:\n\n``` clojure\n(let [props {:a 1}]\n  #jsx [App {:\u0026 props}])\n```\n\nSee an example of an application using JSX [here](https://squint-cljs.github.io/demos/squint/solidjs/) ([source](https://github.com/squint-cljs/squint/blob/main/examples/solid-js/src/App.cljs)).\n\n[Play with JSX non the playground](https://squint-cljs.github.io/squint/?repl=true\u0026src=KHJlcXVpcmUgJ1sicmVhY3QiIDphcyByZWFjdF0pCihyZXF1aXJlICdbInJlYWN0LWRvbSIgOmFzIHJkb21dKQoKKGRlZm9uY2UgY29tcG9uZW50LXN0YXRlIChhdG9tIDApKQoKKGRlZm4gQmFyIFt7OmtleXMgW2ZpcnN0bmFtZSBsYXN0bmFtZV0gOmFzIHByb3BzfV0KICAobGV0IFtbY2xpY2tzIHNldENsaWNrc10gKHJlYWN0L3VzZVN0YXRlIEBjb21wb25lbnQtc3RhdGUpXQogICAgI2pzeCBbOjw%2BCiAgICAgICAgICBbOnNwYW4gZmlyc3RuYW1lICIgIiBsYXN0bmFtZV0KICAgICAgICAgIFs6ZGl2ICJZb3UgY2xpY2tlZCAiIGNsaWNrcyAiIHRpbWVzISJdCiAgICAgICAgICBbOmJ1dHRvbiB7Om9uQ2xpY2sgIyhzZXRDbGlja3MgKHN3YXAhIGNvbXBvbmVudC1zdGF0ZSBpbmMpKX0KICAgICAgICAgICAiQ2xpY2sgbWUiXV0pKQoKKGRlZm4gRm9vIFtdCiAgI2pzeCBbOmRpdiAiSGVsbG8sICIKICAgICAgICAobGV0IFttIChhc3NvYyB7OmZpcnN0bmFtZSAiTWljaGllbCJ9IDpsYXN0bmFtZSAiQm9ya2VudCIpXQogICAgICAgICAgI2pzeCBbQmFyIHs6JiBtfV0pXSkKCihkZWZvbmNlIGVsdCAoZG90byAoanMvZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAiZGl2IikKICAgICAgICAgICAgICAgKGpzL2RvY3VtZW50LmJvZHkucHJlcGVuZCkpKQoKKGRlZiByb290IChyZG9tL2NyZWF0ZVJvb3QgZWx0KSkKCigucmVuZGVyIHJvb3QgI2pzeCBbRm9vXSk%3D)\n\n## HTML\n\nSimilar to JSX, squint allows you to produce HTML as strings using hiccup notation:\n\n``` clojure\n(def my-html #html [:div \"Hello\"])\n```\n\nwill set the `my-html` variable to an HTML object equal to\n`\u003cdiv\u003eHello\u003c/div\u003e`. To produce a string from the HTML object, call `str` on it.\n\nHTML objects can be nested:\n\n``` clojure\n(defn my-html [x] #html [:\u003c\u003e [:div \"Hello\"] x])\n(my-html #html [:div \"Goodbye\"]) ;;=\u003e Html {s: \"\u003cdiv\u003eHello\u003c/div\u003e\u003cdiv\u003eGoodbye\u003c/div\u003e\"}\n```\n\nHTML content is escaped by default:\n\n``` clojure\n(my-html #html [:div \"\u003c\u003e\"]) ;;=\u003e Html {s: \"\u003cdiv\u003eHello\u003c/div\u003e\u003cdiv\u003e\u0026lt;\u0026gt;\u003c/div\u003e\"}\n```\n\nUsing metadata you can modify the tag function, e.g. to use this together with lit-html:\n\n``` clojure\n(ns my-app\n  (:require [\"lit\" :as lit]))\n\n#html ^lit/html [:div \"Hello\"]\n```\n\nThis will produce:\n\n``` clojure\nlit/html`\u003cdiv\u003eHello\u003c/div\u003e`\n```\n\nSee [this](https://squint-cljs.github.io/squint/?src=KG5zIG15bGl0CiAgKDpyZXF1aXJlIFtzcXVpbnQuY29yZSA6cmVmZXIgW2RlZmNsYXNzIGpzLXRlbXBsYXRlXV0KICAgWyJodHRwczovL2VzbS5zaC9saXRAMy4wLjAiIDphcyBsaXRdKSkKCihkZWZjbGFzcyBNeUVsZW1lbnQKICAoZXh0ZW5kcyBsaXQvTGl0RWxlbWVudCkKICAoXjpzdGF0aWMgZmllbGQgcHJvcGVydGllcyB7OmNvdW50IHt9fSkKCiAgKGNvbnN0cnVjdG9yIFt0aGlzXQogICAgKHN1cGVyKQogICAgKHNldCEgdGhpcy5jb3VudCAwKQogICAgKHNldCEgdGhpcy5uYW1lICJIZWxsbyIpKQoKICBPYmplY3QKICAocmVuZGVyIFt0aGlzXQogICAgI2h0bWwgXmxpdC9odG1sCiAgICBbOmRpdgogICAgIFs6aDEgdGhpcy5uYW1lXQogICAgIFs6YnV0dG9uIHsiQGNsaWNrIiB0aGlzLm9uQ2xpY2sKICAgICAgICAgICAgICAgOnBhcnQgImJ1dHRvbiJ9CiAgICAgICJDbGljayBjb3VudCAiIHRoaXMuY291bnRdXSkKCiAgKG9uQ2xpY2sgW3RoaXNdCiAgICAoc2V0ISB0aGlzLmNvdW50IChpbmMgdGhpcy5jb3VudCkpKSkKCihkZWZvbmNlIGZvbwogIChkbwogICAgKGpzL3dpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUgIm15LWVsZW1lbnQiIE15RWxlbWVudCkKICAgIHRydWUpKQoKKGRlZiBhcHAgKG9yIChqcy9kb2N1bWVudC5xdWVyeVNlbGVjdG9yICIjYXBwIikKICAgICAgICAgICAoZG90byAoanMvZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAiZGl2IikKICAgICAgICAgICAgIChzZXQhIC1pZCAiYXBwIikKICAgICAgICAgICAgIChqcy9kb2N1bWVudC5ib2R5LnByZXBlbmQpKSkpCgooc2V0ISAoLi1pbm5lckhUTUwgYXBwKSAjaHRtbCBbOmRpdgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzpteS1lbGVtZW50XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI19bOm15LWVsZW1lbnRdXSk%3D) playground example for a full example.\n\n## Async/await\n\nSquint supports `async/await`:\n\n``` clojure\n(defn ^:async foo [] (js/Promise.resolve 10))\n\n(def x (js-await (foo)))\n\n(println x) ;;=\u003e 10\n```\n\nAnonymous functions must have `^:async` on the `fn` symbol or the function's name:\n\n``` clojure\n(^:async fn [] (js-await {}) 3)\n```\n\n## Generator functions\n\nGenerator functions must be marked with `^:gen`:\n\n``` clojure\n(defn ^:gen foo []\n  (js-yield 1)\n  (js-yield* [2 3])\n  (let [x (inc 3)]\n    (yield x)))\n\n(vec (foo)) ;;=\u003e [1 2 3 4]\n```\n\nAnonymous functions must have `^:gen` on the `fn` symbol:\n\n``` clojure\n(^:gen fn [] (js-yield 1) (js-yield 2))\n```\n\nSee the [playground](https://squint-cljs.github.io/squint/?src=KGRlZm4gXjpnZW4gZm9vIFtdCiAgKGpzLXlpZWxkIDEpCiAgKGpzLXlpZWxkKiBbMiAzXSkKICAobGV0IFt4IChpbmMgMyldCiAgICAoanMteWllbGQgeCkpCiAgKGxldCBbeCAoZG8gKGpzLXlpZWxkIDUpCiAgICAgICAgICAgIDYpXQogICAgKGpzLXlpZWxkIHgpKSkKCih2ZWMgKGZvbykp) for an example.\n\n## Arrow functions\n\nIf for some reason you need to emit arrow functions `() =\u003e ...` rather than\n`function`, you can use `:=\u003e` metadata on the function expression, `fn` symbol\nor argument vector:\n\n``` clojure\n(fn ^:=\u003e [] 1)\n```\n\n## Defclass\n\nSee [doc/defclass.md](doc/defclass.md).\n\n## JS API\n\nThe JavaScript API exposes the `compileString` function:\n\n``` javascript\nimport { compileString } from 'squint-cljs';\n\nconst f = eval(compileString(\"(fn [] 1)\"\n                             , {\"context\": \"expr\",\n                                \"elide-imports\": true}\n                            ));\n\nconsole.log(f()); // prints 1\n```\n\n## REPL\n\nSquint has a console repl which can be started with `squint repl`.\n\n## nREPL\n\nA (currently immature!) nREPL implementation can be used on Node.js with:\n\n``` clojure\nsquint nrepl-server :port 1888\n```\n\nPlease try it out and file issues so it can be improved.\n\n### Emacs\n\nYou can use this together with `inf-clojure` in emacs as follows:\n\nIn a `.cljs` buffer, type `M-x inf-clojure`. Then enter the startup command `npx\nsquint repl` (or `bunx --bun repl`) and select the `clojure` or `babashka` type\nREPL. REPL away!\n\n\u003cimg src=\"https://pbs.twimg.com/media/F6Pry0eWwAEwsRD?format=jpg\"\u003e\n\n## Truthiness\n\nSquint respect CLJS truth semantics: only `null`, `undefined` and `false` are non-truthy, `0` and `\"\"` are truthy.\n\n## Macros\n\nTo load macros, add a `squint.edn` file in the root of your project with\n`{:paths [\"src-squint\"]}` that describes where to find your macro files.  Macros\nare written in `.cljs` or `.cljc` files and are executed using\n[SCI](https://github.com/babashka/sci).\n\nThe following searches for a `foo/macros.cljc` file in the `:paths` described in `squint.edn`.\n\n``` clojure\n(ns foo (:require-macros [foo.macros :refer [my-macro]]))\n\n(my-macro 1 2 3)\n```\n\n## `squint.edn`\n\nIn `squint.edn` you can describe the following options:\n\n- `:paths`: the source paths to search for files. At the moment, only `.cljc` and `.cljs` are supported.\n- `:extension`: the preferred extension to output, which defaults to `.mjs`, but can be set to `.jsx` for React(-like) projects.\n- `:copy-resources`: a set of keywords that represent file extensions of files\n  that should be copied over from source paths. E.g. `:css`, `:json`. Strings\n  may also be used which represent regexes which are processed through\n  `re-find`.\n- `:output-dir`: the directory where compiled files will be created,\n  which defaults to the project root directory.\n\nSee [examples/vite-react](examples/vite-react) for an example project which uses a `squint.edn`.\n\n## Watch\n\nRun `npx squint watch` to watch the source directories described in `squint.edn` and they will be (re-)compiled whenever they change.\nSee [examples/vite-react](examples/vite-react) for an example project which uses this.\n\n## Svelte\n\nA svelte pre-processor for squint can be found [here](https://github.com/jruz/svelte-preprocess-cljs).\n\n## Vite\n\nSee [examples/vite-react](examples/vite-react).\n\n## React Native (Expo)\n\nSee [examples/expo-react-native](examples/expo-react-native).\n\n## Compile on a server, use in a browser\n\nSee [examples/babashka/index.clj](examples/babashka/index.clj).\n\n\u003c!-- This is a small demo of how to leverage squint from a JVM to compile snippets of --\u003e\n\u003c!-- JavaScript that you can use in the browser. --\u003e\n\n\u003c!-- ``` clojure --\u003e\n\u003c!-- (require '[squint.compiler]) --\u003e\n\u003c!-- (-\u003e (squint.compiler/compile-string* \"(prn (map inc [1 2 3]))\" {:core-alias \"_sc\"}) :body) --\u003e\n\u003c!-- ;;=\u003e \"_sc.prn(_sc.map(_sc.inc, [1, 2, 3]));\\n\" --\u003e\n\u003c!-- ``` --\u003e\n\n\u003c!-- The `:core-alias` option takes care of prefixing any `squint.core` function with an alias, in the example `_sc`. --\u003e\n\n\u003c!-- In HTML, to avoid any async ES6, there is also a UMD build of `squint.core` --\u003e\n\u003c!-- available. See the below HTML how it is used. We alias the core library to our --\u003e\n\u003c!-- shorter `_sc` alias ourselves using --\u003e\n\n\u003c!-- ``` html --\u003e\n\u003c!-- \u003cscript\u003eglobalThis._sc = squint.core;\u003c/script\u003e --\u003e\n\u003c!-- ``` --\u003e\n\n\u003c!-- to make it all work. --\u003e\n\n\u003c!-- ``` html --\u003e\n\u003c!-- \u003c!DOCTYPE html\u003e --\u003e\n\u003c!-- \u003chtml\u003e --\u003e\n\u003c!--   \u003chead\u003e --\u003e\n\u003c!--     \u003ctitle\u003eSquint\u003c/title\u003e --\u003e\n\u003c!--     \u003cscript src=\"https://cdn.jsdelivr.net/npm/squint-cljs@0.2.30/lib/squint.core.umd.js\"\u003e\u003c/script\u003e --\u003e\n\u003c!--     \u003c\\!-- rename squint.core to a shorter alias at your convenience: -\\-\u003e --\u003e\n\u003c!--     \u003cscript\u003eglobalThis._sc = squint.core;\u003c/script\u003e --\u003e\n\u003c!--     \u003c\\!-- compile JS on the server using: (squint.compiler/compile-string* \"(prn (map inc [1 2 3]))\" {:core-alias \"_sc\"}) -\\-\u003e --\u003e\n\u003c!--     \u003cscript\u003e --\u003e\n\u003c!--       _sc.prn(_sc.map(_sc.inc, [1, 2, 3])); --\u003e\n\u003c!--     \u003c/script\u003e --\u003e\n\u003c!--   \u003c/head\u003e --\u003e\n\u003c!--   \u003cbody\u003e --\u003e\n\u003c!--     \u003cbutton onClick=\"_sc.prn(_sc.map(_sc.inc, [1, 2, 3]));\"\u003e --\u003e\n\u003c!--       Click me --\u003e\n\u003c!--     \u003c/button\u003e --\u003e\n\u003c!--   \u003c/body\u003e --\u003e\n\u003c!-- \u003c/html\u003e --\u003e\n\u003c!-- ``` --\u003e\n\n## Playground\n\n- [Pinball](https://squint-cljs.github.io/squint/?src=https://gist.githubusercontent.com/borkdude/ca3af924dc2526f00361f28dcf5d0bfb/raw/09cd9e17bf0d6fa3655d0e7cbf2c878e19cb894f/pinball.cljs)\n- [Wordle](https://squint-cljs.github.io/squint/?src=https://gist.githubusercontent.com/borkdude/9ed90af225a57ba6b8d9dd12e7c71eea/raw/02fd614cad0da4ac696511c438ebd9ed67d412b5/wordle.cljs)\n- [React](https://squint-cljs.github.io/squint/?repl=true\u0026src=KHJlcXVpcmUgJ1sicmVhY3QiIDphcyByZWFjdF0pCihyZXF1aXJlICdbInJlYWN0LWRvbSIgOmFzIHJkb21dKQoKKGRlZm9uY2UgY29tcG9uZW50LXN0YXRlIChhdG9tIDApKQoKKGRlZm4gQmFyIFt7OmtleXMgW2ZpcnN0bmFtZSBsYXN0bmFtZV0gOmFzIHByb3BzfV0KICAobGV0IFtbY2xpY2tzIHNldENsaWNrc10gKHJlYWN0L3VzZVN0YXRlIEBjb21wb25lbnQtc3RhdGUpXQogICAgI2pzeCBbOjw%2BCiAgICAgICAgICBbOnNwYW4gZmlyc3RuYW1lICIgIiBsYXN0bmFtZV0KICAgICAgICAgIFs6ZGl2ICJZb3UgY2xpY2tlZCAiIGNsaWNrcyAiIHRpbWVzISJdCiAgICAgICAgICBbOmJ1dHRvbiB7Om9uQ2xpY2sgIyhzZXRDbGlja3MgKHN3YXAhIGNvbXBvbmVudC1zdGF0ZSBpbmMpKX0KICAgICAgICAgICAiQ2xpY2sgbWUiXV0pKQoKKGRlZm4gRm9vIFtdCiAgI2pzeCBbOmRpdiAiSGVsbG8sICIKICAgICAgICAobGV0IFttIChhc3NvYyB7OmZpcnN0bmFtZSAiTWljaGllbCJ9IDpsYXN0bmFtZSAiQm9ya2VudCIpXQogICAgICAgICAgI2pzeCBbQmFyIHs6JiBtfV0pXSkKCihkZWZvbmNlIGVsdCAoZG90byAoanMvZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAiZGl2IikKICAgICAgICAgICAgICAgKGpzL2RvY3VtZW50LmJvZHkucHJlcGVuZCkpKQoKKGRlZiByb290IChyZG9tL2NyZWF0ZVJvb3QgZWx0KSkKCigucmVuZGVyIHJvb3QgI2pzeCBbRm9vXSk%3D), [preact](https://squint-cljs.github.io/squint/?repl=true\u0026jsx.import-source=https%3A%2F%2Fesm.sh%2Fpreact%4010.19.2\u0026src=KHJlcXVpcmUgJ1siaHR0cHM6Ly9lc20uc2gvcHJlYWN0QDEwLjE5LjIiIDphcyByZWFjdF0pCihyZXF1aXJlICdbImh0dHBzOi8vZXNtLnNoL3ByZWFjdEAxMC4xOS4yL2hvb2tzIiA6YXMgaG9va3NdKQoKKGRlZm9uY2UgY29tcG9uZW50LXN0YXRlIChhdG9tIDApKQoKKGRlZm4gQmFyIFt7OmtleXMgW2ZpcnN0bmFtZSBsYXN0bmFtZV0gOmFzIHByb3BzfV0KICAobGV0IFtbY2xpY2tzIHNldENsaWNrc10gKGhvb2tzL3VzZVN0YXRlIEBjb21wb25lbnQtc3RhdGUpXQogICAgI2pzeCBbOjw%2BCiAgICAgICAgICBbOnNwYW4gZmlyc3RuYW1lICIgIiBsYXN0bmFtZV0KICAgICAgICAgIFs6ZGl2ICJZb3UgY2xpY2tlZCAiIGNsaWNrcyAiIHRpbWVzISJdCiAgICAgICAgICBbOmJ1dHRvbiB7Om9uQ2xpY2sgIyhzZXRDbGlja3MgKHN3YXAhIGNvbXBvbmVudC1zdGF0ZSBpbmMpKX0KICAgICAgICAgICAiQ2xpY2sgbWUiXV0pKQoKKGRlZm4gRm9vIFtdCiAgI2pzeCBbOmRpdiAiSGVsbG8sICIKICAgICAgICAobGV0IFttIChhc3NvYyB7OmZpcnN0bmFtZSAiTWljaGllbCJ9IDpsYXN0bmFtZSAiQm9ya2VudCIpXQogICAgICAgICAgI2pzeCBbQmFyIHs6JiBtfV0pXSkKCihkZWZvbmNlIGVsdCAoZG90byAoanMvZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAiZGl2IikKICAgICAgICAgICAgICAgKGpzL2RvY3VtZW50LmJvZHkucHJlcGVuZCkpKQoKKHJlYWN0L3JlbmRlciAjanN4IFtGb29dIGVsdCk%3D)\n- [TC39 Records and Tuples](https://squint-cljs.github.io/squint/?repl=true\u0026src=KHJlcXVpcmUgJ1siaHR0cHM6Ly91bnBrZy5jb20vQGJsb29tYmVyZy9yZWNvcmQtdHVwbGUtcG9seWZpbGwiIDphcyB0YzM5XSkKCihkZWYgYSAoanMvUmVjb3JkIHs6YSAxfSkpCihkZWYgYiAoanMvUmVjb3JkIHs6YSAxfSkpCig9IGEgYikgOzsgdHJ1ZSwgdGhhbmsgZ29kCihkZWYgc3RvcmUgKG5ldyBqcy9NYXApKQooLnNldCBzdG9yZSBhICJrZXllZCBieSBjb2xsZWN0aW9uIGEiKQo7OyBhbHRob3VnaCB3ZSBnZXQgdGhlIHZhbHVlIGZyb20gdGhlIG1hcCB1c2luZyBiLCB3ZSBnZXQgdGhlIHNhbWUgdmFsdWUgb3V0IGFzIGEKKC5nZXQgc3RvcmUgYikgOzs9PiAia2V5ZWQgYnkgY29sbGVjdGlvbiBhIgooZGVmIHQxIChqcy9UdXBsZSAxIDIpKQooZGVmIHQyIChqcy9UdXBsZSAxIDIpKQooZGVmIG15LW1hcCAobmV3IGpzL01hcCBbW3QxIDpoZWxsb10gW3QyIDp0aGVyZV1dKSkKKGdldCBteS1tYXAgdDEpIDs7PT4gdGhlcmUKKGNvbnRhaW5zPyAje3QxfSB0MikgOzsgdHJ1ZQooY291bnQgI3t0MSB0Mn0pIDs7IDEgOzsgdGhhbmsgZ29k)\n- [edn-data](https://squint-cljs.github.io/squint/?repl=true\u0026src=KHJlcXVpcmUgJ1siaHR0cHM6Ly9lc20uc2gvZWRuLWRhdGFAMS4xLjEvZGlzdC9pbmRleC5qcyIgOmFzIGVkbl0pCgooZWRuL3BhcnNlRUROU3RyaW5nICJ7OmEgMSA6YiAjezpmb28gOmJhciA6YmF6fSA6YyAjaW5zdCBcIjIwMDBcIn0iCiAgezptYXBBcyA6b2JqZWN0IDprZXl3b3JkQXMgOnN0cmluZyA6c2V0QXMgOnNldH0pCgooZWRuL3BhcnNlRUROU3RyaW5nIChlZG4vdG9FRE5TdHJpbmdGcm9tU2ltcGxlT2JqZWN0IHs6YSAxIDpiIDIgOmMgI3s6YSA6YiA6Y319KQogIHs6bWFwQXMgOm9iamVjdCA6a2V5d29yZEFzIDpzdHJpbmcgOnNldEFzIDpzZXR9KQ%3D%3D)\n- [Immutable-js](https://squint-cljs.github.io/squint/?src=KHJlcXVpcmUgJ1siaHR0cHM6Ly9lc20uc2gvaW1tdXRhYmxlIiA6YXMgaW1tXSkKCihsZXQgW20gKG5ldyBpbW0vTWFwIFtbMSAyXV0pCiAgICAgIG0gKGltbS9zZXQgbSA6Zm9vIDpiYXIpXQogICg6Zm9vICgudG9KU09OIG0pKSk%3D)\n- [Loading a UMD module](https://squint-cljs.github.io/squint/?repl=true\u0026src=KGRlZm4gXjphc3luYyBqcy1yZXF1aXJlIFt1cmwgbW9kdWxlXQogIChsZXQgW21vZHVsZSAob3IgbW9kdWxlIHs6ZXhwb3J0cyB7fX0pCiAgICAgICAgcmVzcCAoanMtYXdhaXQgKGpzL2ZldGNoIHVybCkpCiAgICAgICAgc2NyaXB0IChqcy1hd2FpdCAoLnRleHQgcmVzcCkpCiAgICAgICAgZnVuYyAoanMvRnVuY3Rpb24gIm1vZHVsZSIgImV4cG9ydHMiIHNjcmlwdCldCiAgICAoLmNhbGwgZnVuYyBtb2R1bGUgbW9kdWxlICguLWV4cG9ydHMgbW9kdWxlKSkKICAgICguLWV4cG9ydHMgbW9kdWxlKSkpCgooZGVmIGVxdWFsIChqcy1hd2FpdCAoanMtcmVxdWlyZSAiaHR0cHM6Ly91bnBrZy5jb20vZmFzdC1kZWVwLWVxdWFsQDMuMS4zL2luZGV4LmpzIikpKQoKKGVxdWFsIFsxIDIgM10gWzEgMiAzXSk%3D)\n- [Vega-lite](https://squint-cljs.github.io/squint/?repl=true\u0026src=KGRlZm4gXjphc3luYyBldmFsLXNjcmlwdCBbdXJsXQogIChsZXQgW3Jlc3AgKGpzLWF3YWl0IChqcy9mZXRjaCB1cmwpKQogICAgICAgIHNjcmlwdCAoanMtYXdhaXQgKC50ZXh0IHJlc3ApKV0KICAgIChqcy9ldmFsIHNjcmlwdCkpKQoKKGpzLWF3YWl0IChldmFsLXNjcmlwdCAiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS92ZWdhQDUiKSkKKGpzLWF3YWl0IChldmFsLXNjcmlwdCAiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS92ZWdhLWxpdGVANCIpKQooanMtYXdhaXQgKGV2YWwtc2NyaXB0ICJodHRwczovL2Nkbi5qc2RlbGl2ci5uZXQvbnBtL3ZlZ2EtZW1iZWRANiIpKQoKKGRlZm9uY2UgY3JlYXRlLWRpdgogIChkbwogICAgKGpzL2RvY3VtZW50LmJvZHkucHJlcGVuZCAoZG90byAoanMvZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAiZGl2IikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2V0ISAtaWQgInZpcyIpKSkKICAgIHRydWUpKQoKKGRlZiBzcGVjIHs6JHNjaGVtYSAiaHR0cHM6Ly92ZWdhLmdpdGh1Yi5pby9zY2hlbWEvdmVnYS1saXRlL3Y0LjAuanNvbiIKICAgICAgICAgICA6ZGVzY3JpcHRpb24gIkEgc2ltcGxlIGJhciBjaGFydCB3aXRoIGVtYmVkZGVkIGRhdGEuIgogICAgICAgICAgIDpkYXRhIHs6dmFsdWVzIFt7OmEgIkEiLDpiIDI4fSx7OmEgIkIiLDpiIDU1fSx7OmEgIkMiLDpiIDQzfQogICAgICAgICAgICAgICAgICAgICAgICAgICB7OmEgIkQiLDpiIDkxfSx7OmEgIkUiLDpiIDgxfSx7OmEgIkYiLDpiIDUzfQogICAgICAgICAgICAgICAgICAgICAgICAgICB7OmEgIkciLDpiIDE5fSx7OmEgIkgiLDpiIDg3fSx7OmEgIkkiLDpiIDUyfV19CiAgICAgICAgICAgOm1hcmsgOmJhcgogICAgICAgICAgIDplbmNvZGluZyB7OnggeyJmaWVsZCIgImEiLCJ0eXBlIiAib3JkaW5hbCJ9CiAgICAgICAgICAgICAgICAgICAgICA6eSB7ImZpZWxkIiAiYiIsInR5cGUiICJxdWFudGl0YXRpdmUifX19KQoKKGpzL3ZlZ2FFbWJlZCAiI3ZpcyIgc3BlYyk%3D)\n- [Vue.js](https://squint-cljs.github.io/squint/?repl=true\u0026src=KHJlcXVpcmUgJ1siaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS92dWVAMy4zLjEwL2Rpc3QvdnVlLmVzbS1icm93c2VyLmpzIiA6YXMgdnVlXSkKKGRlZm9uY2UgZWx0CiAgKGRvdG8gKGpzL2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQgImRpdiIpCiAgICAoanMvZG9jdW1lbnQuYm9keS5wcmVwZW5kKQogICAgKHNldCEgLWlubmVySFRNTCAiPGRpdiBpZD1cImFwcFwiPgogIDxidXR0b24gQGNsaWNrPVwiY291bnQrK1wiPgogICAgQ291bnQgaXM6IHt7IGNvdW50IH19CiAgPC9idXR0b24%2BCjwvZGl2PiIpKSkKCihkZWYgYXBwICh2dWUvY3JlYXRlQXBwCiAgICAgICAgICAgezpzZXR1cCAoZm4gW10KICAgICAgICAgICAgICAgICAgICAgezpjb3VudCAodnVlL3JlZiAwKX0pfSkpCgooLm1vdW50IGFwcCAiI2FwcCIp)\n- [Tic-tac-toe](https://squint-cljs.github.io/squint/?src=https://gist.githubusercontent.com/borkdude/6463b9628292e820742838b840096386/raw/8602b9153010af1a11c775dadebbedeae32c8e08/tictactoe.cljs)\n- [Date-fns](https://squint-cljs.github.io/squint/?src=KHJlcXVpcmUgJ1siaHR0cHM6L2VzbS5zaC9kYXRlLWZuc0AzLjAuMC9pbmRleC5tanMiIDphcyBkXSkKCihkL2Zvcm1hdFJlbGF0aXZlIChkL3N1YkRheXMgKGpzL0RhdGUuKSAyKSAoanMvRGF0ZS4pKQ%3D%3D)\n- [VanJS](https://squint-cljs.github.io/squint/?src=KHJlcXVpcmUgJ1siaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L2doL3ZhbmpzLW9yZy92YW4vcHVibGljL3Zhbi0xLjIuNy5taW4uanMkZGVmYXVsdCIKICAgICAgICAgICA6YXMgdmFuXSkKCihkZWYgYnV0dG9uIHZhbi90YWdzLmJ1dHRvbikKKGRlZiBzcGFuIHZhbi90YWdzLnNwYW4pCgooZGVmbiBDb3VudGVyIFtdCiAgKGxldCBbY291bnRlciAodmFuL3N0YXRlIDApXQogICAgKHNwYW4gIlx1Mjc2NCIgY291bnRlciAiICIKICAgICAgKGJ1dHRvbiB7Om9uY2xpY2sgIyhzZXQhICguLXZhbCBjb3VudGVyKSAoZGVjICguLXZhbCBjb3VudGVyKSkpfQogICAgICAgICJcdWQ4M2RcdWRjNGUiKQogICAgICAoYnV0dG9uIHs6b25jbGljayAjKHNldCEgKC4tdmFsIGNvdW50ZXIpIChpbmMgKC4tdmFsIGNvdW50ZXIpKSl9CiAgICAgICAgIlx1ZDgzZFx1ZGM0ZCIpKSkpCgooZG9jdW1lbnQuYm9keS5wcmVwZW5kIChDb3VudGVyKSk%3D)\n- [Mithril](https://squint-cljs.github.io/squint/?src=KHJlcXVpcmUgJ1siaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvbWl0aHJpbC8yLjIuMi9taXRocmlsLm1pbi5qcyJdKQoKKGRlZiBtIGpzL20pCgooZGVmIHJvb3QgKG9yCiAgICAgICAgICAgIChqcy9kb2N1bWVudC5xdWVyeVNlbGVjdG9yICIjYXBwIikKICAgICAgICAgICAgKGRvdG8gKGpzL2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQgImRpdiIpCiAgICAgICAgICAgICAgKHNldCEgLWlkICJhcHAiKQogICAgICAgICAgICAgIChqcy9kb2N1bWVudC5ib2R5LnByZXBlbmQpKSkpCgooZGVmIGNvdW50ZXIgKGF0b20gMCkpCgooLm1vdW50IG0gcm9vdAogIHs6dmlldyAoZm4gW10KICAgICAgICAgICAobSA6bWFpbgogICAgICAgICAgICAgWyhtIDpoMSAiVHJ5IG1lIG91dCIpCiAgICAgICAgICAgICAgKG0gOmJ1dHRvbgogICAgICAgICAgICAgICAgezpvbmNsaWNrICMoc3dhcCEgY291bnRlciBpbmMpfQogICAgICAgICAgICAgICAgIkNsaWNrczogIiBAY291bnRlcildKSl9KQ%3D%3D)\n- [Rough](https://squint-cljs.github.io/squint/?src=KHJlcXVpcmUgJ1siaHR0cHM6Ly9lc20uc2gvcm91Z2hqc0A0LjYuNiRkZWZhdWx0IiA6YXMgcm91Z2hdKQoKKGRlZiBjYW52YXMgKG9yIChqcy9kb2N1bWVudC5xdWVyeVNlbGVjdG9yICIjY2FudmFzIikKICAgICAgICAgICAgICAoZG90byAoanMvZG9jdW1lbnQuY3JlYXRlRWxlbWVudCAiY2FudmFzIikKICAgICAgICAgICAgICAgIChzZXQhIC1pZCAiY2FudmFzIikKICAgICAgICAgICAgICAgIChzZXQhIC13aWR0aCAyNTApCiAgICAgICAgICAgICAgICAoc2V0ISAtaGVpZ2h0IDI1MCkKICAgICAgICAgICAgICAgIChqcy9kb2N1bWVudC5ib2R5LnByZXBlbmQpKSkpCgooZGVmIHJjIChyb3VnaC9jYW52YXMgY2FudmFzKSkKCihyYy5yZWN0YW5nbGUgMTAgMTAgMjAwIDIwMCkKKHJjLmNpcmNsZSA4MCAxMjAgNTAgezpmaWxsIDpncmVlbn0pCihyYy5jaXJjbGUgODAgMTYwIDUwIHs6ZmlsbCA6cmVkfSk%3D)\n- [Immer](https://squint-cljs.github.io/squint/?src=KHJlcXVpcmUgJ1siaHR0cHM6Ly9lc20uc2gvaW1tZXJAMTAuMC4zIiA6YXMgaW1tZXJdKQoKKGRlZm4gYXBwZW5kIFtzdHJdCiAgKGpzL2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQKICAgKGRvdG8gKGpzL2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQgImRpdiIpCiAgICAgKHNldCEgLWlubmVyVGV4dCAoanMvSlNPTi5zdHJpbmdpZnkgc3RyKSkpKSkKCihkZWYgYmFzZS1zdGF0ZSBbezp0aXRsZSAiTGVhcm4gU3F1aW50ISIKICAgICAgICAgICAgICAgICAgOmRvbmUgdHJ1ZX0KICAgICAgICAgICAgICAgICB7OnRpdGxlICJUcnkgSW1tZXIiCiAgICAgICAgICAgICAgICAgIDpkb25lIGZhbHNlfV0pCgooZGVmIG5leHQtc3RhdGUgKGltbWVyL3Byb2R1Y2UgYmFzZS1zdGF0ZQogICAgICAgICAgICAgICAgICAoZm4gW2RyYWZ0XQogICAgICAgICAgICAgICAgICAgIChhc3NvYy1pbiEgZHJhZnQgWzAgOmRvbmVdIHRydWUpCiAgICAgICAgICAgICAgICAgICAgKGNvbmohIGRyYWZ0IHs6dGl0bGUgIlR3ZWV0IGFib3V0IGl0In0pKSkpCgooYXBwZW5kIGJhc2Utc3RhdGUpCihhcHBlbmQgbmV4dC1zdGF0ZSk%3D), [mutative](https://squint-cljs.github.io/squint/?src=KHJlcXVpcmUgJ1siaHR0cHM6Ly9lc20uc2gvbXV0YXRpdmUiIDphcyBtdXRdKQoKKGRlZiBiYXNlLXN0YXRlIHs6Zm9vIDpiYXIKICAgICAgICAgICAgICAgICA6bGlzdCBbezp0ZXh0IDpjb2Rpbmd9XX0pCgooZGVmIHN0YXRlCiAgKG11dC9jcmVhdGUgYmFzZS1zdGF0ZQogICAgKGZuIFtkcmFmdF0KICAgICAgKHVwZGF0ZSEgZHJhZnQgOmxpc3QgY29uaiEgezp0ZXh0IDpsZWFybmluZ30pKSkpCgpzdGF0ZQ%3D%3D)\n- [MobX](https://squint-cljs.github.io/squint/?repl=true\u0026jsx=\u0026src=KG5zIGNvdW50ZXIKICAoOnJlcXVpcmUgW3NxdWludC5jb3JlIDpyZWZlciBbZGVmY2xhc3NdXQogICBbInJlYWN0IiA6YXMgcmVhY3RdCiAgIFsicmVhY3QtZG9tIiA6YXMgcmRvbV0KICAgWyJodHRwczovL2VzbS5zaC9tb2J4QDYuMTIuMCIgOnJlZmVyIFttYWtlQXV0b09ic2VydmFibGVdXQogICBbImh0dHBzOi8vZXNtLnNoL21vYngtcmVhY3QtbGl0ZUA0LjAuNSIgOnJlZmVyIFtvYnNlcnZlcl1dCiAgICkpCgooZGVmY2xhc3MgVGltZXIKICAoZmllbGQgc2Vjb25kc1Bhc3NlZCAwKQogIChjb25zdHJ1Y3RvciBbdGhpc10KICAgIChtYWtlQXV0b09ic2VydmFibGUgdGhpcykpCiAgT2JqZWN0CiAgKGluY3JlYXNlVGltZXIgW19dCiAgICAoc2V0ISBzZWNvbmRzUGFzc2VkIChpbmMgc2Vjb25kc1Bhc3NlZCkpKSkKCihkZWYgbXktdGltZXIgKG5ldyBUaW1lcikpCgooZGVmIFRpbWVyVmlldwogIChvYnNlcnZlciAoZm4gW3t0aW1lciA6dGltZXJ9IGNvbXBdCiAgICAgICAgICAgICAgI2pzeAogICAgICAgICAgICAgICBbOnNwYW4gIlNlY29uZHMgcGFzc2VkOiAiICg6c2Vjb25kc1Bhc3NlZCB0aW1lcildKSkpCgooZGVmb25jZSBlbHQgKGRvdG8gKGpzL2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQgImRpdiIpIChqcy9kb2N1bWVudC5ib2R5LnByZXBlbmQpKSkKKGRlZiByb290IChyZG9tL2NyZWF0ZVJvb3QgZWx0KSkKKC5yZW5kZXIgcm9vdCAjanN4IFtUaW1lclZpZXcgezp0aW1lciBteS10aW1lcn1dKQoKKGRlZm9uY2UgY3JlYXRlLWludGVydmFsCiAgKGRvCiAgICAoanMvc2V0SW50ZXJ2YWwgKGZuIFtdICguaW5jcmVhc2VUaW1lciBteS10aW1lcikpIDEwMDApCiAgICB0cnVlKSk%3D) - [another example using atoms](https://squint-cljs.github.io/squint/?repl=true\u0026src=KG5zIGNvdW50ZXIKICAoOnJlcXVpcmUgW3NxdWludC5jb3JlIDpyZWZlciBbZGVmY2xhc3NdXQogICBbInJlYWN0IiA6YXMgcmVhY3RdCiAgIFsicmVhY3QtZG9tIiA6YXMgcmRvbV0KICAgWyJodHRwczovL2VzbS5zaC9tb2J4QDYuMTIuMCIgOnJlZmVyIFttYWtlQXV0b09ic2VydmFibGVdXQogICBbImh0dHBzOi8vZXNtLnNoL21vYngtcmVhY3QtbGl0ZUA0LjAuNSIgOnJlZmVyIFtvYnNlcnZlcl1dKSkKCihkZWYgbXktdGltZXIKICAobWFrZUF1dG9PYnNlcnZhYmxlCiAgICAoYXRvbSB7OmNvdW50ZXIgMH0pKSkKCihkZWZuIGluYy1jb3VudGVyIFtdCiAgKHN3YXAhIG15LXRpbWVyIHVwZGF0ZSA6Y291bnRlciBpbmMpKQoKKGRlZm4gVGltZXJWaWV3IFtdCiAgI2pzeCBbOnNwYW4gIlNlY29uZHMgcGFzc2VkOiAiCiAgICAgICAgKDpjb3VudGVyIEBteS10aW1lcildKQoKKGRlZiBUaW1lclZpZXcgKG9ic2VydmVyIFRpbWVyVmlldykpCgooZGVmb25jZSBlbHQgKGRvdG8gKGpzL2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQgImRpdiIpIChqcy9kb2N1bWVudC5ib2R5LnByZXBlbmQpKSkKKGRlZiByb290IChyZG9tL2NyZWF0ZVJvb3QgZWx0KSkKKC5yZW5kZXIgcm9vdCAjanN4IFtUaW1lclZpZXddKQoKKGRlZm9uY2UgY3JlYXRlLWludGVydmFsCiAgKGRvCiAgICAoanMvc2V0SW50ZXJ2YWwgaW5jLWNvdW50ZXIgMTAwMCkKICAgIHRydWUpKQ%3D%3D)\n- [SolidJS](https://squint-cljs.github.io/squint/?repl=true\u0026jsx.import-source=https%3A%2F%2Fesm.sh%2Fsolid-js%401.8.10%2Fh\u0026src=KHJlcXVpcmUgJ1siaHR0cHM6Ly9lc20uc2gvc29saWQtanNAMS44LjEwIiA6YXMgc29saWRdKQoocmVxdWlyZSAnWyJodHRwczovL2VzbS5zaC9zb2xpZC1qc0AxLjguMTAvd2ViIiA6YXMgc29saWQtd2ViXSkKCihkZWZuIENoaWxkQ29tcG9uZW50IFt7OmtleXMgW2NvdW50XX1dCiAgI2pzeCBbOmRpdiAiQ291bnQgdmFsdWUgaXMgIiBjb3VudF0pCgooZGVmbiBDb3VudGluZ0NvbXBvbmVudCBbXQogIChsZXQgW1tjb3VudCBzZXRDb3VudF0gKHNvbGlkL2NyZWF0ZVNpZ25hbCAxMCkKICAgICAgICBpbnRlcnZhbCAoanMvc2V0SW50ZXJ2YWwgIyhzZXRDb3VudCBpbmMpCiAgICAgICAgICAgICAgICAgICAxMDAwKV0KICAgIChzb2xpZC9vbkNsZWFudXAgIyhqcy9jbGVhckludGVydmFsIGludGVydmFsKSkKICAgICNqc3ggW0NoaWxkQ29tcG9uZW50IHs6Y291bnQKICAgICAgICAgICAgICAgICAgICAgICAgICA7OyByZWFjdGl2ZSB2YWx1ZSBtdXN0IGJlIHdyYXBwZWQgaW4gdGh1bmsKICAgICAgICAgICAgICAgICAgICAgICAgICA7OyB3aGVuIHVzaW5nIGpzeC1ydW50aW1lIGluc3RlYWQgb2Ygc29saWQtanMgY29tcGlsZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAoZm4gW10gY291bnQpfV0pKQoKKGRlZiBlbHQgKG9yCiAgICAgICAgICAgKGpzL2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IgIiNhcHAiKQogICAgICAgICAgIChkb3RvIChqcy9kb2N1bWVudC5jcmVhdGVFbGVtZW50ICJkaXYiKQogICAgICAgICAgICAgKHNldCEgLWlkICJhcHAiKQogICAgICAgICAgICAgKGpzL2RvY3VtZW50LmJvZHkucHJlcGVuZCkpKSkKCihkZWZvbmNlIGRpc3Bvc2UgKGF0b20gKGZuIFtdKSkpCihkbwogIChAZGlzcG9zZSkKICAocmVzZXQhIGRpc3Bvc2UKICAgIChzb2xpZC13ZWIvcmVuZGVyIChmbiBbXSAjanN4IFtDb3VudGluZ0NvbXBvbmVudF0pIGVsdCkpKQ%3D%3D)\n- [Web components](https://squint-cljs.github.io/squint/?src=KG5zIG15ZWxlbWVudAogICg6cmVxdWlyZSBbc3F1aW50LmNvcmUgOnJlZmVyIFtkZWZjbGFzc11dKSkKCihkZWZjbGFzcyBNeUVsZW1lbnQKICAoZXh0ZW5kcyBqcy9IVE1MRWxlbWVudCkKCiAgKGZpZWxkIC1zaGFkb3cpCiAgKGZpZWxkIGNvdW50IDApCgogIChjb25zdHJ1Y3RvciBbdGhpc10KICAgIChzdXBlcikKICAgIChzZXQhIC1zaGFkb3cgKC5hdHRhY2hTaGFkb3cgdGhpcyB7Om1vZGUgOm9wZW59KSkpCgogIE9iamVjdAogIChoYW5kbGVDbGljayBbdGhpcyBlXQogICAgKHNldCEgY291bnQgKGluYyBjb3VudCkpCiAgICAoLnJlbmRlciB0aGlzKSkKCiAgKGNvbm5lY3RlZENhbGxiYWNrIFt0aGlzXQogICAgKC5hZGRFdmVudExpc3RlbmVyIHRoaXMgImNsaWNrIiB0aGlzLmhhbmRsZUNsaWNrKQogICAgKC5yZW5kZXIgdGhpcykpCgogIChkaXNjb25uZWN0ZWRDYWxsYmFjayBbdGhpc10KICAgICgucmVtb3ZlRXZlbnRMaXN0ZW5lciB0aGlzICJjbGljayIgdGhpcy5oYW5kbGVDbGljaykpCgogIChyZW5kZXIgW3RoaXNdCiAgICAoc2V0ISAoLi1pbm5lckhUTUwgLXNoYWRvdykKICAgICAgI2h0bWwgWzpidXR0b24gIkNsaWNrIGNvdW50ICIgY291bnRdKSkpCgooLmRlZmluZSBjdXN0b21FbGVtZW50cyA6bXktZWxlbWVudCBNeUVsZW1lbnQpCgooZGVmIGFwcCAob3IgKGpzL2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IgIiNhcHAiKQogICAgICAgICAgIChkb3RvIChqcy9kb2N1bWVudC5jcmVhdGVFbGVtZW50IDpkaXYpCiAgICAgICAgICAgICAoc2V0ISAtaWQgOmFwcCkKICAgICAgICAgICAgIChqcy9kb2N1bWVudC5ib2R5LnByZXBlbmQpKSkpCgooc2V0ISAoLi1pbm5lckhUTUwgYXBwKSAjaHRtbCBbOm15LWVsZW1lbnRdKQ%3D%3D\u0026repl=true)\n- [Quill](https://squint-cljs.github.io/squint/?src=KGRlZiBjc3MKICAob3IgKGpzL2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IgIiNjc3MiKQogICAgKGRvdG8gKGpzL2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQgOmRpdikKICAgICAgKHNldCEgLWlkIDpjc3MpCiAgICAgIChzZXQhIC1pbm5lckhUTUwgI2h0bWwKICAgICAgICAgICAgICAgWzpsaW5rIHs6aHJlZiAiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L25wbS9xdWlsbEAyLjAuMC9kaXN0L3F1aWxsLnNub3cuY3NzIgogICAgICAgICAgICAgICAgICAgICAgIDpyZWwgInN0eWxlc2hlZXQifV0pCiAgICAgIChqcy9kb2N1bWVudC5oZWFkLnByZXBlbmQpKSkpCgooZGVmIGFwcCAob3IgKGpzL2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IgIiNhcHAiKQogICAgICAgICAgIChkb3RvIChqcy9kb2N1bWVudC5jcmVhdGVFbGVtZW50IDpkaXYpCiAgICAgICAgICAgICAoc2V0ISAtaWQgOmFwcCkKICAgICAgICAgICAgIChqcy9kb2N1bWVudC5ib2R5LnByZXBlbmQpKSkpCgoocmVxdWlyZSAnWyJodHRwczovL2VzbS5zaC9xdWlsbCRkZWZhdWx0IiA6YXMgUXVpbGxdKQooUXVpbGwuICIjYXBwIiB7OnRoZW1lICJzbm93In0p)\n- [defmulti](https://squint-cljs.github.io/squint/?src=KHJlcXVpcmUgJ1siaHR0cHM6Ly9lc20uc2gvQHRoaS5uZy9kZWZtdWx0aSIgOnJlZmVyIFtkZWZtdWx0aV1dKQoKKGRlZiBmb28gKGRlZm11bHRpIChmbiBbeF0geCkpKQoKKC5pc2EgZm9vIDIzICJvZGQiKQoKKC5hZGQgZm9vICJvZGQiIChmbiBbeF0gKHN0ciB4ICIgaXMgYW4gb2RkIG51bWJlciIpKSkKCihmb28gMjMp): multimethods in squint as a library\n- [Game of life](https://squint-cljs.github.io/squint/?src=KG5zIGluZGV4KQoKKGRlZm4gY2VsbCBbZ3JpZC14IGdyaWQteSBzaXplXQogIHs6c2l6ZSBzaXplCiAgIDp4IGdyaWQteAogICA6eSBncmlkLXkKICAgOmFsaXZlPyAoPiAoanMvTWF0aC5yYW5kb20pIDAuNSl9KQoKKGRlZm4gZHJhdy1jZWxsIFtjdHggW18gezprZXlzIFthbGl2ZT8geCB5IHNpemVdfV1dCiAgKC5iZWdpblBhdGggY3R4KQogICguYXJjIGN0eCAoKiB4IHNpemUpICgqIHkgc2l6ZSkgKC8gc2l6ZSAyKSAwICgqIDIganMvTWF0aC5QSSkpCiAgKHNldCEgKC4tZmlsbFN0eWxlIGN0eCkgKGlmIGFsaXZlPyAiIzExNzg1NSIgIiMzMDMwMzAiKSkKICAoLmZpbGwgY3R4KQogICguc3Ryb2tlIGN0eCkKICAoLmNsb3NlUGF0aCBjdHgpKQoKKGRlZm4gY3JlYXRlLWdyaWQgW3Jvd3MgY29sdW1ucyBjZWxsLXNpemVdCiAgKGludG8ge30KICAgICAgICAoZm9yIFt4IChyYW5nZSByb3dzKQogICAgICAgICAgICAgIHkgKHJhbmdlIGNvbHVtbnMpXQogICAgICAgICAgW1t4IHldIChjZWxsIHggeSBjZWxsLXNpemUpXSkpKQoKKGRlZm4gY2xlYXItc2NyZWVuIFtjdHggY2FudmFzXQogIChzZXQhICguLWZpbGxTdHlsZSBjdHgpICIjMzAzMDMwIikKICAoLmZpbGxSZWN0IGN0eCAwIDAgKC4td2lkdGggY2FudmFzKSAoLi1oZWlnaHQgY2FudmFzKSkpCgooZGVmbiByZW5kZXIgW3s6a2V5cyBbY3R4IGdyaWQgY2FudmFzXX1dCiAgKGNsZWFyLXNjcmVlbiBjdHggY2FudmFzKQogIChkb3NlcSBbY2VsbCBncmlkXQogICAgKGRyYXctY2VsbCBjdHggY2VsbCkpKQoKKGRlZm4gZ2V0LWNlbGwgW2dyaWQgeCB5IG1heC14IG1heC15XQogIChsZXQgW3ggKGNvbmQgKDwgeCAwKSBtYXgteCAoPiB4IG1heC14KSAwIDplbHNlIHgpCiAgICAgICAgeSAoY29uZCAoPCB5IDApIG1heC15ICg%2BIHkgbWF4LXkpIDAgOmVsc2UgeSldCiAgICAoZ2V0IGdyaWQgW3ggeV0pKSkKCihkZWZuIGNvbXB1dGUtZ3JpZCBbezprZXlzIFtncmlkIG1heC14IG1heC15XX1dCiAgKGRvc2VxIFtbXyB7OmtleXMgW3ggeSBhbGl2ZT9dIDphcyBjZWxsfV0gZ3JpZF0KICAgIChsZXQgW2xpdmUtbmVpZ2hib3VyLWNvdW50ICgtPj4gWyhnZXQtY2VsbCBncmlkIChkZWMgeCkgKGRlYyB5KSBtYXgteCBtYXgteSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXQtY2VsbCBncmlkIChpbmMgeCkgKGluYyB5KSBtYXgteCBtYXgteSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXQtY2VsbCBncmlkIChpbmMgeCkgKGRlYyB5KSBtYXgteCBtYXgteSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXQtY2VsbCBncmlkIChkZWMgeCkgKGluYyB5KSBtYXgteCBtYXgteSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXQtY2VsbCBncmlkIHggKGluYyB5KSBtYXgteCBtYXgteSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXQtY2VsbCBncmlkIHggKGRlYyB5KSBtYXgteCBtYXgteSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXQtY2VsbCBncmlkIChkZWMgeCkgeSBtYXgteCBtYXgteSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXQtY2VsbCBncmlkIChpbmMgeCkgeSBtYXgteCBtYXgteSldCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXAgIyhnZXQgJSA6YWxpdmU%2FKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbHRlciB0cnVlPykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvYWxsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY291bnQpKV0KICAgICAgKGFzc29jISBjZWxsIDphbGl2ZT8KICAgICAgICAgICAgICAoaWYgYWxpdmU%2FCiAgICAgICAgICAgICAgICAoY29uZHAgPSBsaXZlLW5laWdoYm91ci1jb3VudAogICAgICAgICAgICAgICAgICAwIGZhbHNlCiAgICAgICAgICAgICAgICAgIDEgZmFsc2UKICAgICAgICAgICAgICAgICAgMiB0cnVlCiAgICAgICAgICAgICAgICAgIDMgdHJ1ZQogICAgICAgICAgICAgICAgICA0IGZhbHNlCiAgICAgICAgICAgICAgICAgIGZhbHNlKQogICAgICAgICAgICAgICAgKD0gMyBsaXZlLW5laWdoYm91ci1jb3VudCkpKSkpKQoKKGRlZm4gZ2FtZS1sb29wIFtzdGF0ZV0KICAocmVuZGVyIHN0YXRlKQogIChjb21wdXRlLWdyaWQgc3RhdGUpCiAgKGpzL3NldFRpbWVvdXQgIyhqcy93aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lIChmbiBbXSAoZ2FtZS1sb29wIHN0YXRlKSkpIDYwKSkKCihkZWZuIGdhbWUgW2NhbnZhcy1pZF0KICAobGV0IFtjYW52YXMgKGpzL2RvY3VtZW50LmdldEVsZW1lbnRCeUlkIGNhbnZhcy1pZCkKICAgICAgICBjdHggKC5nZXRDb250ZXh0IGNhbnZhcyAiMmQiKQogICAgICAgIG1heC15IDUwCiAgICAgICAgbWF4LXggKCogbWF4LXkgKC8gKC4td2lkdGggY2FudmFzKSAoLi1oZWlnaHQgY2FudmFzKSkpIAogICAgICAgIGluaXRpYWwtZ3JpZCAoY3JlYXRlLWdyaWQgbWF4LXggbWF4LXkgMTApXQogICAgKGdhbWUtbG9vcCB7OmNhbnZhcyBjYW52YXMKICAgICAgICAgICAgICAgIDpjdHggY3R4CiAgICAgICAgICAgICAgICA6bWF4LXggKGRlYyBtYXgteCkKICAgICAgICAgICAgICAgIDptYXgteSAoZGVjIG1heC15KQogICAgICAgICAgICAgICAgOmdyaWQgaW5pdGlhbC1ncmlkfSkpKQoKKGRlZm9uY2UgbWFrZS1jYW52YXMKICAoZG8gKGpzL2RvY3VtZW50LmJvZHkucHJlcGVuZAogICAgICAgIChkb3RvIChqcy9kb2N1bWVudC5jcmVhdGVFbGVtZW50ICJjYW52YXMiKQogICAgICAgICAgKHNldCEgLWlkICJjYW52YXMiKQogICAgICAgICAgKHNldCEgLWhlaWdodCAoKiBqcy93aW5kb3cuaW5uZXJIZWlnaHQgMC4yNSkpCiAgICAgICAgICAoc2V0ISAtd2lkdGggKCoganMvd2luZG93LmlubmVyV2lkdGggMC4yNSkpKSkKICAgIHRydWUpKQoKKGdhbWUgImNhbnZhcyIp)\n- [docx](https://squint-cljs.github.io/squint/?src=KG5zIG15LWRvY3gKICAoOnJlcXVpcmUgWyJodHRwczovL2VzbS5zaC9kb2N4IiA6YXMgZG9jeAogICAgICAgICAgICAgOnJlZmVyIFtEb2N1bWVudCBQYXJhZ3JhcGggVGV4dFJ1bgogICAgICAgICAgICAgICAgICAgICBQYWNrZXJdXSkpCgooZGVmIGRvYwogIChEb2N1bWVudC4KICAgIHs6c2VjdGlvbnMKICAgICBbezpwcm9wZXJ0aWVzIHt9CiAgICAgICA6Y2hpbGRyZW4KICAgICAgIFsoUGFyYWdyYXBoLgogICAgICAgICAgezpjaGlsZHJlbgogICAgICAgICAgIFsoVGV4dFJ1bi4gIkhlbGxvIFdvcmxkIikKICAgICAgICAgICAgKFRleHRSdW4uCiAgICAgICAgICAgICAgezp0ZXh0ICJGb28gQmFyIgogICAgICAgICAgICAgICA6Ym9sZCB0cnVlfSkKICAgICAgICAgICAgKFRleHRSdW4uCiAgICAgICAgICAgICAgezp0ZXh0ICJcdEdpdGh1YiBpcyB0aGUgYmVzdCIKICAgICAgICAgICAgICAgOmJvbGQgdHJ1ZX0pXX0pXX1dfSkpCgooZGVmbiBeOmFzeW5jIGRvd25sb2FkIFtdCiAgKGxldCBbYnl0ZXMgKGpzLWF3YWl0IChQYWNrZXIudG9CdWZmZXIgZG9jKSkKICAgICAgICBibG9iIChqcy9CbG9iLiBbYnl0ZXNdIHs6dHlwZSAiYXBwbGljYXRpb24vZG9jeCJ9KQogICAgICAgIGxpbmsgKC5jcmVhdGVFbGVtZW50IGpzL2RvY3VtZW50ICJhIildCiAgICAoc2V0ISAoLi1ocmVmIGxpbmspIChqcy9VUkwuY3JlYXRlT2JqZWN0VVJMIGJsb2IpKQogICAgKHNldCEgKC4tZG93bmxvYWQgbGluaykgIk15IHdvcmQgZG9jLmRvY3giKQogICAgKHNldCEgKC4taW5uZXJUZXh0IGxpbmspICJEb3dubG9hZCB5b3VyIHdvcmQgZG9jdW1lbnQhIikKICAgIChqcy9kb2N1bWVudC5ib2R5LnByZXBlbmQgbGluaykpKQoKKGRvd25sb2FkKQ%3D%3D)\n- [snabbdom](https://squint-cljs.github.io/squint/?src=KGRlZiByb290IChvcgogICAgICAgICAgICAoanMvZG9jdW1lbnQucXVlcnlTZWxlY3RvciAiI2NvbnRhaW5lciIpCiAgICAgICAgICAgIChkb3RvIChqcy9kb2N1bWVudC5jcmVhdGVFbGVtZW50ICJkaXYiKQogICAgICAgICAgICAgIChzZXQhIC1pZCAiY29udGFpbmVyIikKICAgICAgICAgICAgICAoanMvZG9jdW1lbnQuYm9keS5wcmVwZW5kKSkpKQoKKHJlcXVpcmUgJ1siaHR0cHM6Ly9lc20uc2gvc25hYmJkb20iIDpyZWZlciBbaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTW9kdWxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzTW9kdWxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlTW9kdWxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TGlzdGVuZXJzTW9kdWxlXV0pCgooZGVmIHBhdGNoIChpbml0IFtjbGFzc01vZHVsZSBwcm9wc01vZHVsZSBzdHlsZU1vZHVsZSBldmVudExpc3RlbmVyc01vZHVsZV0pKQoKCgooZGVmIHZub2RlIChoIDpkaXYjY29udGFpbmVyCiAgICAgICAgICAgICBbKGggOnNwYW4gezpzdHlsZSB7OmZvbnRXZWlnaHQgOmJvbGR9fSAiVGhpcyBpcyBib2xkIildKSkKCihkZWYgcGF0Y2hlZC12bm9kZSAocGF0Y2ggcm9vdCB2bm9kZSkpCgooZGVmIG5ldy12bm9kZSAoaCA6ZGl2I2NvbnRhaW5lcgogICAgICAgICAgICAgICAgIFsoaCA6c3BhbiB7OnN0eWxlIHs6Y29sb3IgOmdyZWVufX0gIlRoaXMgaXMgZ3JlZW4iKV0pKQoKKHBhdGNoIHBhdGNoZWQtdm5vZGUgbmV3LXZub2RlKQ%3D%3D)\n\n## T-shirt\n\nBuy the t-shirt [here](https://www.etsy.com/listing/1761522434/squint-cljs-t-shirt)!\n\nLicense\n=======\n\nSquint is licensed under the EPL. See epl-v10.html in the root directory for more information.\n","funding_links":["https://github.com/sponsors/borkdude"],"categories":["Clojure","Languages"],"sub_categories":["JavaScript"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsquint-cljs%2Fsquint","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsquint-cljs%2Fsquint","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsquint-cljs%2Fsquint/lists"}