From f2365646d21d932edc53b26213b82358a60f4a4d Mon Sep 17 00:00:00 2001 From: Nick Alexander Date: Tue, 5 Jul 2016 18:13:29 -0700 Subject: [PATCH] Add lein-cljsbuild and adapt datascript's release-js vehicle. --- .gitignore | 6 ++++-- README.md | 17 +++++++++++++++ node.clj | 6 ------ package.json | 12 ++++------- project.clj | 38 +++++++++++++++++++++++++++++++-- release-js/README.md | 5 +++++ release-js/test_include_node.js | 2 ++ release-js/wrap_bare.sh | 7 ++++++ release-js/wrapper.prefix | 29 +++++++++++++++++++++++++ release-js/wrapper.suffix | 6 ++++++ repl.clj | 10 +++++---- src/datomish/js.cljs | 11 ++++++++++ 12 files changed, 127 insertions(+), 22 deletions(-) delete mode 100644 node.clj create mode 100644 release-js/README.md create mode 100644 release-js/test_include_node.js create mode 100755 release-js/wrap_bare.sh create mode 100644 release-js/wrapper.prefix create mode 100644 release-js/wrapper.suffix create mode 100644 src/datomish/js.cljs diff --git a/.gitignore b/.gitignore index 49b23eec..31ee84b3 100644 --- a/.gitignore +++ b/.gitignore @@ -15,9 +15,11 @@ /.nrepl-port /checkouts/ /classes/ -/lib/ +/target/ /node_modules/ -/out/ /target/ pom.xml pom.xml.asc +/.cljs_node_repl/ +/release-js/datomish.js +/release-js/datomish.bare.js diff --git a/README.md b/README.md index 7f2d76f9..caeaad96 100644 --- a/README.md +++ b/README.md @@ -80,6 +80,8 @@ npm install brew install rlwrap ``` +Run `lein cljsbuild auto advanced` to generate JavaScript into `target/`. + ### Starting a ClojureScript REPL from the terminal ``` @@ -127,3 +129,18 @@ Now you can use `:Eval`, `cqc`, and friends to evaluate code. Fireplace should c ``` :Connect nrepl://localhost:62385 ``` + +### Preparing an NPM release + +The intention is that the `release-js/` directory is roughly the shape of an npm-ready JavaScript package. + +To generate a require/import-ready `release-js/datomish.js`, run +``` +lein cljsbuild once release +``` +To verify that importing into Node.js succeeds, run +``` +node release-js/test +``` + +Many thanks to ([David Nolen](https://github.com/swannodette)) and ([Nikita Prokopov](https://github.com/tonsky)) for demonstrating how to package ClojureScript for distribution via npm. diff --git a/node.clj b/node.clj deleted file mode 100644 index e860619c..00000000 --- a/node.clj +++ /dev/null @@ -1,6 +0,0 @@ -(require 'cljs.build.api) - -(cljs.build.api/build "src" - {:main 'datomish.core - :output-to "main.js" - :target :nodejs}) diff --git a/package.json b/package.json index 370da76d..5f64ee8c 100644 --- a/package.json +++ b/package.json @@ -6,19 +6,13 @@ }, "version": "0.1.0-SNAPSHOT", "description": "A persistent, embedded knowledge base inspired by Datomic and DataScript.", - "main": "index.js", "dependencies": { "source-map-support": "ncalexan/node-source-map-support#fileUrls-plus", "sqlite3": "mossop/node-sqlite3#v3.1.4.1", "thenify-all": "^1.6.0", "ws": "1.1.1" }, - "devDependencies": {}, - "directories": { - "test": "test" - }, - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "devDependencies": { }, "repository": { "type": "git", @@ -29,5 +23,7 @@ "bugs": { "url": "https://github.com/mozilla/datomish/issues" }, - "homepage": "https://github.com/mozilla/datomish#readme" + "homepage": "https://github.com/mozilla/datomish#readme", + "main": "./datomish.js", + "files": ["datomish.js"] } diff --git a/project.clj b/project.clj index f5f3a468..7d1d0fc0 100644 --- a/project.clj +++ b/project.clj @@ -3,7 +3,41 @@ :url "https://github.com/mozilla/datomish" :license {:name "Mozilla Public License Version 2.0" :url "https://github.com/mozilla/datomish/blob/master/LICENSE"} + :dependencies [[org.clojure/clojurescript "1.9.89"] + [org.clojure/clojure "1.8.0"]] + + :cljsbuild {:builds [{:id "release" + :source-paths ["src"] + :assert false + :compiler {:output-to "release-js/datomish.bare.js" + :optimizations :advanced + :pretty-print false + :elide-asserts true + :output-wrapper false + :parallel-build true} + :notify-command ["release-js/wrap_bare.sh"]} + ]} + :profiles {:dev {:dependencies [[com.cemerick/piggieback "0.2.1"] [org.clojure/tools.nrepl "0.2.10"]] - :repl-options {:nrepl-middleware [cemerick.piggieback/wrap-cljs-repl]}}} - :dependencies [[org.clojure/clojurescript "1.9.89"]]) + :repl-options {:nrepl-middleware [cemerick.piggieback/wrap-cljs-repl]} + :source-paths [] + :plugins [[lein-cljsbuild "1.1.2"]] + :cljsbuild {:builds [{:id "advanced" + :source-paths ["src"] + :compiler { + :output-to "target/datomish.js" + :optimizations :advanced + :source-map "target/datomish.js.map" + :pretty-print true + :recompile-dependents false + :parallel-build true + }} + ]} + } + } + + :clean-targets ^{:protect false} ["target" + "release-js/datomish.bare.js" + "release-js/datomish.js"] + ) diff --git a/release-js/README.md b/release-js/README.md new file mode 100644 index 00000000..f31204bf --- /dev/null +++ b/release-js/README.md @@ -0,0 +1,5 @@ +# Datomish + +Datomish is a persistent, embedded knowledge base. It's written in ClojureScript, and draws heavily on [DataScript](https://github.com/tonsky/datascript) and [Datomic](http://datomic.com). + +For more info, check out the [project page](https://github.com/mozila/datomish). diff --git a/release-js/test_include_node.js b/release-js/test_include_node.js new file mode 100644 index 00000000..683261cd --- /dev/null +++ b/release-js/test_include_node.js @@ -0,0 +1,2 @@ +var d = require('./datomish'); +console.log(d.q("[:find ?e ?v :where [?e \"name\" ?v] {:x :y}]")); diff --git a/release-js/wrap_bare.sh b/release-js/wrap_bare.sh new file mode 100755 index 00000000..0256ad22 --- /dev/null +++ b/release-js/wrap_bare.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +set -e + +(cat release-js/wrapper.prefix; cat release-js/datomish.bare.js; cat release-js/wrapper.suffix) > release-js/datomish.js + +echo "Packed release-js/datomish.js" diff --git a/release-js/wrapper.prefix b/release-js/wrapper.prefix new file mode 100644 index 00000000..91248d32 --- /dev/null +++ b/release-js/wrapper.prefix @@ -0,0 +1,29 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +// Datomish 0.1.0-SNAPSHOT + +(function (definition) { + // This file will function properly as a