Skip to content

Commit cb2d75f

Browse files
Automatically load new dependencies when a ns form is compiled.
1 parent d30aa09 commit cb2d75f

File tree

3 files changed

+33
-27
lines changed

3 files changed

+33
-27
lines changed

src/clj/cljs/repl.clj

+25-15
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,35 @@
2222
(-put [this k f])
2323
(-tear-down [this]))
2424

25+
(defn load-namespace
26+
"Load a namespace and all of its dependencies into the evaluation environment.
27+
The environment is responsible for ensuring that each namespace is loaded once and
28+
only once."
29+
[repl-env sym]
30+
(let [sym (if (and (seq? sym)
31+
(= (first sym) 'quote))
32+
(second sym)
33+
sym)
34+
opts {:output-dir (get repl-env :working-dir ".repl")}
35+
deps (->> (cljsc/add-dependencies opts {:requires [(name sym)] :type :seed})
36+
(remove (comp #{["goog"]} :provides))
37+
(remove (comp #{:seed} :type))
38+
(map #(select-keys % [:provides :url])))]
39+
(doseq [{:keys [url provides]} deps]
40+
(-load repl-env provides url))))
41+
42+
(defn- load-dependencies
43+
[repl-env requires]
44+
(doseq [ns requires]
45+
(load-namespace repl-env ns)))
46+
2547
(defn evaluate-form
2648
[repl-env env form]
2749
(try
2850
(let [ast (comp/analyze env form)
2951
js (comp/emits ast)]
52+
(when (= (:op ast) :ns)
53+
(load-dependencies repl-env (vals (:requires ast))))
3054
(when *cljs-verbose*
3155
(print js))
3256
(let [ret (-evaluate repl-env (:line (meta form)) js)]
@@ -35,7 +59,7 @@
3559
;;TODO - file bug with google, this is bs error
3660
;;this is what you get when you try to 'teach new developers'
3761
;;via errors (goog/base.js 104)
38-
:error (when-not (and (seq? form) (= 'ns (first form)))
62+
:error (when-not (and (seq? form) (= 'ns (first form))) ;; dry
3963
(println (:value ret))
4064
(when-let [st (:stacktrace ret)]
4165
(println st)))
@@ -68,20 +92,6 @@
6892
(-put repl-env :filename f)
6993
(load-stream repl-env res))))
7094

71-
(defn load-namespace
72-
[repl-env sym]
73-
(let [sym (if (and (seq? sym)
74-
(= (first sym) 'quote))
75-
(second sym)
76-
sym)
77-
opts {:output-dir (get repl-env :working-dir ".repl")}
78-
deps (->> (cljsc/add-dependencies opts {:requires [(name sym)] :type :seed})
79-
(remove (comp #{["goog"]} :provides))
80-
(remove (comp #{:seed} :type))
81-
(map #(select-keys % [:provides :url])))]
82-
(doseq [{:keys [url provides]} deps]
83-
(-load repl-env provides url))))
84-
8595
(defn repl
8696
"Note - repl will reload core.cljs every time, even if supplied old repl-env"
8797
[repl-env & {:keys [verbose warn-on-undeclared]}]

src/clj/cljs/repl/browser.clj

+8-11
Original file line numberDiff line numberDiff line change
@@ -247,17 +247,14 @@
247247
(browser-eval (slurp url))))
248248
(swap! loaded-libs (partial apply conj) missing))))
249249

250-
(defrecord BrowserEnv [opts]
251-
IJavaScriptEnv
250+
(extend-protocol repl/IJavaScriptEnv
251+
clojure.lang.IPersistentMap
252252
(-setup [this]
253-
(do (comp/with-core-cljs (start-server opts))
253+
(do (comp/with-core-cljs (start-server this))
254254
(browser-eval "goog.provide('cljs.user');")))
255-
(-evaluate [this line js]
256-
(browser-eval js))
257-
(-load [this ns url]
258-
(load-javascript this ns url))
259-
(-put [this k v]
260-
nil)
255+
(-evaluate [this line js] (browser-eval js))
256+
(-load [this ns url] (load-javascript this ns url))
257+
(-put [this k v] nil)
261258
(-tear-down [this]
262259
(do (stop-server)
263260
(reset! server-state {}))))
@@ -280,14 +277,14 @@
280277
(spit file (compile-client-js opts)))
281278
file))
282279

283-
(defn repl-env [& {:keys [port root] :as opts}]
280+
(defn repl-env [& {:as opts}]
284281
(let [opts (merge {:port 9000 :optimizations :simple :working-dir ".repl"} opts)]
285282
(do (swap! server-state
286283
(fn [old] (assoc old :client-js
287284
(future (create-client-js-file
288285
opts
289286
(io/file (:working-dir opts) "client.js"))))))
290-
(BrowserEnv. opts))))
287+
opts)))
291288

292289
(comment
293290

src/clj/cljs/repl/rhino.clj

-1
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,6 @@ goog.require = function(rule){Packages.clojure.lang.RT[\"var\"](\"cljs.repl.rhin
125125

126126
(load-namespace 'clojure.set)
127127

128-
(load-namespace 'goog.crypt)
129128
(ns test.crypt
130129
(:require [goog.crypt :as c]))
131130
(c/stringToByteArray "Hello")

0 commit comments

Comments
 (0)