cljs.repl.node/setup
function | since v0.0-2629 | Edit |
(setup repl-env)
(setup {:keys [host port socket state], :as repl-env} opts)
(defn setup
([repl-env] (setup repl-env nil))
([{:keys [host port socket state] :as repl-env} opts]
(let [tname (thread-name)]
(.put results tname (LinkedBlockingQueue.))
(.put outs tname *out*)
(.put errs tname *err*))
(locking lock
(when-not @socket
(let [output-dir (io/file (util/output-directory opts))
_ (.mkdirs output-dir)
of (io/file output-dir "node_repl.js")
_ (spit of
(string/replace (slurp (io/resource "cljs/repl/node_repl.js"))
"var PORT = 5001;"
(str "var PORT = " (:port repl-env) ";")))
proc (.start (build-process opts repl-env of))
env (ana/empty-env)
core (io/resource "cljs/core.cljs")
path (.getPath (.getCanonicalFile output-dir))
[fc & cs] (rest (util/path-seq path)) root (.substring path 0 (+ (.indexOf path fc) (count fc)))
root-path (vec (cons root cs))
rewrite-path (conj root-path "goog")]
(reset! (:proc repl-env) proc)
(loop [r nil]
(when-not (= r "ready")
(Thread/sleep 50)
(try
(reset! socket (create-socket host port))
(catch Exception e))
(if @socket
(recur (read-response (:in @socket)))
(recur nil))))
(.start (Thread. (bound-fn [] (event-loop proc (:in @socket)))))
(let [core-js (closure/compile core
(assoc opts :output-file
(closure/src-file->target-file
core (dissoc opts :output-dir))))
deps (closure/add-dependencies opts core-js)]
(apply closure/output-unoptimized
(assoc (assoc opts :target :none)
:output-to (.getPath (io/file output-dir "node_repl_deps.js")))
deps))
(node-eval repl-env
(-> (slurp (io/resource "cljs/bootstrap_nodejs.js"))
(string/replace "path.resolve(__dirname, \"..\", \"base.js\")"
(platform-path (conj rewrite-path "bootstrap" ".." "base.js")))
(string/replace
"path.join(\".\", \"..\", src)"
(str "path.join(" (platform-path rewrite-path) ", src)"))
(string/replace "path.resolve(__dirname, \"..\", src)"
(str "path.join(" (platform-path rewrite-path) ", src)"))
(string/replace
"var CLJS_ROOT = \".\";"
(str "var CLJS_ROOT = " (platform-path root-path) ";"))))
(node-eval repl-env
(str "require("
(platform-path (conj root-path "node_repl_deps.js"))
")"))
(repl/evaluate-form repl-env env ""
'(do
(.require js/goog "cljs.core")
(enable-console-print!)))
(bootstrap/install-repl-goog-require repl-env env)
(node-eval repl-env
(str "goog.global.CLOSURE_UNCOMPILED_DEFINES = "
(json/write-str (:closure-defines opts)) ";")))))
(swap! state update :listeners inc)))