squint-cljs / cherry

Experimental ClojureScript to ES6 module compiler
https://squint-cljs.github.io/cherry
562 stars 22 forks source link
cherry-cljs clojure clojurescript

Cherry :cherries:

Experimental ClojureScript to ES6 module compiler.

Reducing friction between ClojureScript and JS tooling.

:warning: This project is an experiment and not recommended to be used in production. It currently has many bugs and will undergo many breaking changes.

Also check out Squint which is a CLJS syntax to JS compiler.

Quickstart

Although it's early days and far from complete, you're welcome to try out cherry and submit issues.

$ mkdir cherry-test && cd cherry-test
$ npm init -y
$ npm install cherry-cljs@latest

Create a .cljs file, e.g. example.cljs:

(ns example
  (:require ["fs" :as fs]
            ["url" :refer [fileURLToPath]]))

(prn (fs/existsSync (fileURLToPath js/import.meta.url)))

(defn foo [{:keys [a b c]}]
  (+ a b c))

(js/console.log (foo {:a 1 :b 2 :c 3}))

Then compile and run (run does both):

$ npx cherry run example.cljs
true
6

Run npx cherry --help to see all command line options.

Examples

A few examples of currenly working projects compiled by cherry:

See the examples directory for more.

Project goals

Goals of cherry:

Cherry may introduce new constructs such as js-await which won't be compatible with current CLJS. Also it might not support all features that CLJS offers. As such, using existing libraries from the CLJS ecosystem or compiling Cherry CLJS code with the CLJS compiler may become challenging. However, some results of this experiment may end up as improvements in the CLJS compiler if they turn out to be of value.

See slides of a presentation given at Dutch Clojure Days 2022 about cherry and squint.

Depending on interest both from people working on this and the broader community, the above goals may or may not be pursued. If you are interested in maturing cherry, please submit issues for bug reports or share your thoughts on Github Discussions.

Cherry started out as a fork of Scriptjure. Currently it's being reworked to meet the above goals.

Embed cherry in a CLJS/shadow app

See embed.md.

Development

$ git clone git@github.com:squint-cljs/cherry.git
$ cd cherry
$ bb dev

defclass

See squint docs.

js-template

See squint docs.

License

Cherry is licensed under the EPL, the same as Clojure core and Scriptjure. See epl-v10.html in the root directory for more information.