Skip to content

Commit b09f183

Browse files
author
dnolen
committed
preloads should work under all optimization settings. preloads should be
able to load arbitrary dependencies including foreign libs etc.
1 parent 37b5d7d commit b09f183

File tree

1 file changed

+52
-16
lines changed

1 file changed

+52
-16
lines changed

src/main/clojure/cljs/closure.clj

+52-16
Original file line numberDiff line numberDiff line change
@@ -763,9 +763,9 @@
763763
(javascript-file foreign url provides requires)
764764
js-map)))
765765
required-js)
766-
[(when (-> @env/*compiler* :options :emit-constants)
767-
(let [url (deps/to-url (str (util/output-directory opts) "/constants_table.js"))]
768-
(javascript-file nil url url ["constants-table"] ["cljs.core"] nil nil)))]
766+
(when (-> @env/*compiler* :options :emit-constants)
767+
(let [url (deps/to-url (str (util/output-directory opts) "/constants_table.js"))]
768+
[(javascript-file nil url url ["constants-table"] ["cljs.core"] nil nil)]))
769769
required-cljs
770770
inputs)))))
771771

@@ -878,12 +878,11 @@
878878
inputs))
879879

880880
(defn add-js-sources
881-
"Given list of IJavaScript objects, add foreign-deps, constants-table, and
882-
preloads IJavaScript objects to the list."
881+
"Given list of IJavaScript objects, add foreign-deps, constants-table
882+
IJavaScript objects to the list."
883883
[inputs opts]
884884
(let [requires (set (mapcat deps/-requires inputs))
885-
required-js (js-dependencies opts requires)
886-
cenv @env/*compiler*]
885+
required-js (js-dependencies opts requires)]
887886
(concat
888887
(map
889888
(fn [{:keys [foreign url file provides requires] :as js-map}]
@@ -892,17 +891,53 @@
892891
(javascript-file foreign url provides requires)
893892
js-map)))
894893
required-js)
895-
[(when (-> cenv :options :emit-constants)
896-
(let [url (deps/to-url (str (util/output-directory opts) "/constants_table.js"))]
897-
(javascript-file nil url url ["constants-table"] ["cljs.core"] nil nil)))]
898-
(remove nil?
899-
(map (fn [preload]
900-
(if-let [uri (:uri (source-for-namespace preload cenv))]
901-
(-compile uri opts)
902-
(util/debug-prn "WARNING: preloads namespace" preload "does not exist")))
903-
(:preloads opts)))
894+
(when (-> @env/*compiler* :options :emit-constants)
895+
(let [url (deps/to-url (str (util/output-directory opts) "/constants_table.js"))]
896+
[(javascript-file nil url url ["constants-table"] ["cljs.core"] nil nil)]))
904897
inputs)))
905898

899+
(defn distinct-by
900+
([k coll]
901+
(let [step (fn step [xs seen]
902+
(lazy-seq
903+
((fn [[f :as xs] seen]
904+
(when-let [s (seq xs)]
905+
(let [v (get f k)]
906+
(if (contains? seen v)
907+
(recur (rest s) seen)
908+
(cons f (step (rest s) (conj seen v)))))))
909+
xs seen)))]
910+
(step coll #{}))))
911+
912+
(defn add-preloads
913+
"Add :preloads to a given set of inputs (IJavaScript). Returns a new
914+
list of inputs where the preloaded namespaces and their deps come immediately after
915+
cljs.core or the constants table depending on the optimization setting. Any
916+
files needing copying or compilation will be compiled and/or copied to the
917+
appropiate location."
918+
[inputs opts]
919+
(let [pred (fn [x]
920+
(if (:emit-constants opts)
921+
(not= ["constants-table"] (:provides x))
922+
(not= ["cljs.core"] (:provides x))))
923+
pre (take-while pred inputs)
924+
post (drop-while pred inputs)
925+
preloads (remove nil?
926+
(map
927+
(fn [preload]
928+
(try
929+
(comp/find-source preload)
930+
(catch Throwable t
931+
(util/debug-prn "WARNING: preload namespace" preload "does not exist"))))
932+
(:preloads opts)))]
933+
(distinct-by :provides
934+
(concat pre [(first post)]
935+
(-> (add-dependency-sources preloads opts)
936+
deps/dependency-order
937+
(compile-sources opts)
938+
(add-js-sources opts))
939+
(next post)))))
940+
906941
(comment
907942
(comp/find-sources-root "samples/hello/src")
908943
(find-dependency-sources (find-sources-root "samples/hello/src"))
@@ -1965,6 +2000,7 @@
19652000
(add-js-sources all-opts)
19662001
(cond-> (= :nodejs (:target all-opts)) (concat [(-compile (io/resource "cljs/nodejs.cljs") all-opts)]))
19672002
deps/dependency-order
2003+
(add-preloads all-opts)
19682004
add-goog-base
19692005
(cond-> (= :nodejs (:target all-opts)) (concat [(-compile (io/resource "cljs/nodejscli.cljs") all-opts)])))
19702006
_ (when (:emit-constants all-opts)

0 commit comments

Comments
 (0)