npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

cherry-cljs

v0.3.23

Published

Experimental ClojureScript to ES6 module compiler.

Downloads

109

Readme

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:

  • Compile .cljs files on the fly into ES6-compatible .mjs files.
  • Compiler will be available on NPM and can be used from JS tooling, but isn't part of the compiled output unless explicitly used.
  • Compiled JS files are fairly readable and have source map support for debugging
  • Compiled JS files are linked to one shared NPM module "cherry-cljs" which contains cljs.core.js, cljs.string, etc. such that libraries written in cherry can be compiled and hosted on NPM, while all sharing the same standard library and data structures. See this tweet on how that looks.
  • Output linked to older versions of cherry will work with newer versions of cherry: i.e. 'binary' compatibility.
  • Light-weight and fast: heavy lifting such as optimizations are expected to be done by JS tooling
  • No dependency on Google Closure: this project will use it for bootstrapping itself (by using the CLJS compiler), but users of this project won't use it for compilation
  • Macro support
  • REPL support
  • Async/await support. See this tweet for a demo.
  • Native support for JS object destructuring: [^:js {:keys [a b]} #js {:a 1 :b 2}]
  • Native support for JSX via #jsx reader tag. See example.

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 [email protected]: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.