Skip to content

Commit 1b22a53

Browse files
committed
CLJS-2667: Non-Node REPL Regression - direct require of JS modules no longer works
cljs.closure/compile-input no longer needs :seed bit as cljs.repl/load-namespaces now handles all input types. change cljs.compiler/load-libs, global-exports-libs and libs-to-load are not mutually exclusive. cljs.repl/load-namespaces can now handle different types of requires directly. If ClojureScript namespace use the normal build pipeline. If JavaScript namespace simply add any JS dependencies and ensure the files are on disk. Removed old hack where we had to read the file system to get the updated module name. This possible because we now invoke handle-js-modules (and include transitive module deps) in cljs.repl/evaluate-form, thus all JS module requires will already be remapped by the time we get to cljs.repl/load-namespaces.
1 parent cddad10 commit 1b22a53

3 files changed

Lines changed: 32 additions & 18 deletions

File tree

src/main/clojure/cljs/closure.clj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2665,7 +2665,7 @@
26652665
(env/ensure
26662666
(let [sources (-> inputs (add-dependency-sources opts))
26672667
opts (handle-js-modules opts sources env/*compiler*)
2668-
sources (-> (remove (comp #{:seed} :type) sources)
2668+
sources (-> sources
26692669
deps/dependency-order
26702670
(compile-sources false opts)
26712671
(#(map add-core-macros-if-cljs-js %))

src/main/clojure/cljs/compiler.cljc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1127,7 +1127,7 @@
11271127
(let [{node-libs true libs-to-load false} (group-by ana/node-module-dep? libs)]
11281128
[node-libs libs-to-load])
11291129
[nil libs]))
1130-
{global-exports-libs true libs-to-load false} (group-by ana/dep-has-global-exports? libs-to-load)]
1130+
global-exports-libs (filter ana/dep-has-global-exports? libs-to-load)]
11311131
(when (-> libs meta :reload-all)
11321132
(emitln "if(!COMPILED) " loaded-libs-temp " = " loaded-libs " || cljs.core.set([\"cljs.core\"]);")
11331133
(emitln "if(!COMPILED) " loaded-libs " = cljs.core.set([\"cljs.core\"]);"))

src/main/clojure/cljs/repl.cljc

Lines changed: 30 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -190,36 +190,50 @@
190190
(assoc :output-dir
191191
(or (:output-dir opts) (get repl-env :working-dir ".repl"))))))
192192

193+
(defn add-url [ijs]
194+
(cond-> ijs
195+
(not (contains? ijs :url))
196+
(assoc :url (io/resource (:file ijs)))))
197+
198+
(defn ns->input [ns opts]
199+
(if-let [input (some-> (util/ns->source ns) (ana/parse-ns opts))]
200+
input
201+
(if-let [input (some->
202+
(get-in @env/*compiler*
203+
[:js-dependency-index (str ns)])
204+
add-url)]
205+
input
206+
(throw
207+
(ex-info (str ns " does not exist")
208+
{::error :invalid-ns})))))
209+
210+
(defn compilable? [input]
211+
(contains? input :source-file))
212+
193213
(defn load-namespace
194214
"Load a namespace and all of its dependencies into the evaluation environment.
195215
The environment is responsible for ensuring that each namespace is loaded once and
196216
only once."
197217
([repl-env ns] (load-namespace repl-env ns nil))
198218
([repl-env ns opts]
199219
(let [ns (if (and (seq? ns) (= (first ns) 'quote)) (second ns) ns)
200-
;; We need to use a seed because many things (npm deps etc.) cannot be
201-
;; *directly* compiled, they must be a part of some ClojureScript ns
202-
;; form - thus we fabricate a seed
203-
sources (->> (cljsc/compile-inputs
204-
[{:requires [(name ns)] :type :seed}]
205-
(merge (env->opts repl-env) opts))
206-
(remove (comp #{["goog"]} :provides)))]
220+
input (ns->input ns opts)
221+
sources (if (compilable? input)
222+
(->> (cljsc/compile-inputs [input]
223+
(merge (env->opts repl-env) opts))
224+
(remove (comp #{["goog"]} :provides)))
225+
(map #(cljsc/source-on-disk opts %)
226+
(cljsc/add-js-sources [input] opts)))]
227+
(when (:repl-verbose opts)
228+
(println (str "load-namespace " ns " , compiled:") (map :provides sources)))
207229
(if (:output-dir opts)
208230
;; REPLs that read from :output-dir just need to add deps,
209231
;; environment will handle actual loading - David
210232
(let [sb (StringBuffer.)]
211233
(doseq [source sources]
212-
(when (:repl-verbose opts)
213-
(println "Loading:" (:provides source)))
214-
;; Need to get :requires and :provides from compiled source
215-
;; not from our own compilation, this issue oddly doesn't seem to
216-
;; affect compiled ClojureScript, should be cleaned up so we
217-
;; don't need this step here - David
218234
(with-open [rdr (io/reader (:url source))]
219235
(.append sb
220-
(cljsc/add-dep-string opts
221-
(merge source
222-
(deps/parse-js-ns (line-seq rdr)))))))
236+
(cljsc/add-dep-string opts source))))
223237
(when (:repl-verbose opts)
224238
(println (.toString sb)))
225239
(-evaluate repl-env "<cljs repl>" 1 (.toString sb)))

0 commit comments

Comments
 (0)