Skip to content

Commit 7de018d

Browse files
committed
CLJS-1098: Browser REPL needs to support :reload and :reload-all
support "reload" and "reload-all" option to patched goog.require. when given "reload" need to remove visited and written information from goog.dependencies_ for the ns. patched goog.isProvided_ should always return false goog.writeScriptTag_ needs to append scripts to body otherwise will blow away the document `clojure.browser.repl/connect` should return a value to make `defonce` usage sensible
1 parent a97b4c8 commit 7de018d

File tree

1 file changed

+26
-14
lines changed

1 file changed

+26
-14
lines changed

src/cljs/clojure/browser/repl.cljs

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515

1616
:author "Bobby Calderwood and Alex Redington"}
1717
clojure.browser.repl
18-
(:require [clojure.browser.net :as net]
18+
(:require [goog.dom :as gdom]
19+
[clojure.browser.net :as net]
1920
[clojure.browser.event :as event]
2021
;; repl-connection callback will receive goog.require('cljs.repl')
2122
;; and monkey-patched require expects to be able to derive it
@@ -115,18 +116,29 @@
115116
"none")))
116117
;; Monkey-patch goog.provide if running under optimizations :none - David
117118
(when-not js/COMPILED
118-
(set! (.-provide__ js/goog) js/goog.provide)
119-
(set! (.-isProvided___ js/goog) js/goog.isProvided_)
120-
(set! (.-provide js/goog)
121-
(fn [name]
122-
(set! (.-isProvided_ js/goog) (fn [name] false))
123-
(.provide__ js/goog name)
124-
(set! (.-isProvided_ js/goog) js/goog.isProvided___)))
119+
(set! (.-require__ js/goog) js/goog.require)
120+
;; suppress useless Google Closure error about duplicate provides
121+
(set! (.-isProvided_ js/goog) (fn [name] false))
125122
(set! (.-writeScriptTag_ js/goog)
126123
(fn [src opt_sourceText]
127-
(let [doc js/goog.global.document]
128-
(if (nil? opt_sourceText)
129-
(.write doc
130-
(str "<script type=\"text/javascript\" src=\"" src "\"></script>"))
131-
(.write doc
132-
(str "<script type=\"text/javascript\">" opt_sourceText "</script>")))))))))
124+
(.appendChild js/document.body
125+
(as-> (.createElement js/document "script") script
126+
(doto script (aset "type" "text/javascript"))
127+
(if (nil? opt_sourceText)
128+
(doto script (aset "src" src))
129+
(doto script (gdom/setTextContext opt_sourceText)))))))
130+
(set! (.-require js/goog)
131+
(fn [src reload]
132+
(when (= reload "reload-all")
133+
(set! (.-cljsReloadAll_ js/goog) true))
134+
(let [reload? (or reload (.-cljsReloadAll__ js/goog))]
135+
(when reload?
136+
(let [path (aget js/goog.dependencies_.nameToPath src)]
137+
(js-delete js/goog.dependencies_.visited path)
138+
(js-delete js/goog.dependencies_.written
139+
(str js/goog.basePath path))))
140+
(let [ret (.require__ js/goog src)]
141+
(when (= reload "reload-all")
142+
(set! (.-cljsReloadAll_ js/goog) false))
143+
ret)))))
144+
repl-connection))

0 commit comments

Comments
 (0)