10000 Libraries can now manage their upstream dependencies using deps.cljs · clojure/clojurescript@e945eb1 · GitHub
[go: up one dir, main page]

Skip to content

Commit e945eb1

Browse files
ckirkendallLuke VanderHart
authored andcommitted
Libraries can now manage their upstream dependencies using deps.cljs
1 parent 8ba4849 commit e945eb1

File tree

2 files changed

+69
-37
lines changed

2 files changed

+69
-37
lines changed

src/clj/cljs/closure.clj

Lines changed: 65 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@
108108
(doall
109109
(map #(io/resource %)
110110
(filter #(do
111-
(and
111+
(and
112112
(.startsWith % lib-path)
113113
(.endsWith % ".js")))
114114
(jar-entry-names jar-path)))))
@@ -121,8 +121,9 @@
121121
(map to-url (filter #(.endsWith (.getName %) ".js") (file-seq (io/file path)))))))
122122

123123

124-
(defn find-js-classpath [path]
124+
(defn find-js-classpath
125125
"finds all js files on the classpath matching the path provided"
126+
[path]
126127
(let [process-entry #(if (.endsWith % ".jar")
127128
(find-js-jar % path)
128129
(find-js-fs (str % "/" path)))
@@ -150,20 +151,25 @@
150151
Options may contain an :externs key with a list of file paths to
151152
load. The :use-only-custom-externs flag may be used to indicate that
152153
the default externs should be excluded."
153-
[{:keys [externs use-only-custom-externs target]}]
154-
(letfn [(filter-js [paths]
155-
(for [p paths u (find-js-resources p)] u))
156-
(add-target [ext]
157-
(if (= :nodejs target)
158-
(cons (io/resource "cljs/nodejs_externs.js")
159-
(or ext []))
160-
ext))
161-
(load-js [ext]
162-
(map #(js-source-file (.getFile %) (slurp %)) ext))]
163-
(let [js-sources (-> externs filter-js add-target load-js)]
154+
[{:keys [externs use-only-custom-externs target ups-externs]}]
155+
(let [filter-cp-js (fn [paths]
156+
(for [p paths u (find-js-classpath p)] u))
157+
filter-js (fn [paths]
158+
(for [p paths u (find-js-resources p)] u))
159+
add-target (fn [ext]
160+
(if (= :nodejs target)
161+
(cons (io/resource "cljs/nodejs_externs.js")
162+
(or ext []))
163+
ext))
164+
load-js (fn [ext]
165+
(map #(js-source-file (.getFile %) (slurp %)) ext))]
166+
(let [js-sources (-> externs filter-js add-target load-js)
167+
ups-sources (-> ups-externs filter-cp-js add-target load-js)
168+
all-sources (concat js-sources ups-sources)]
169+
(println all-sources)
164170
(if use-only-custom-externs
165-
js-sources
166-
(into js-sources (CommandLineRunner/getDefaultExterns))))))
171+
all-sources
172+
(into all-sources (CommandLineRunner/getDefaultExterns))))))
167173

168174
(defn ^com.google.javascript.jscomp.Compiler make-closure-compiler []
169175
(let [compiler (com.google.javascript.jscomp.Compiler.)]
@@ -437,30 +443,37 @@
437443
"Given a library spec (a map containing the keys :file
438444
and :provides), returns a map containing :provides, :requires, :file
439445
and :url"
440-
[lib-spec]
441-
(merge lib-spec {:foreign true
442-
:url (find-url (:file lib-spec))}))
446+
([lib-spec] (load-foreign-library* lib-spec false))
447+
([lib-spec cp-only?]
448+
(let [find-func (if cp-only? io/resource find-url)]
449+
(merge lib-spec {:foreign true
450+
:url (find-func (:file lib-spec))}))))
443451

444452
(def load-foreign-library (memoize load-foreign-library*))
445453

446454
(defn load-library*
447455
"Given a path to a JavaScript library, which is a directory
448456
containing Javascript files, return a list of maps
449457
containing :provides, :requires, :file and :url."
450-
[path]
451-
(letfn [(graph-node [u]
452-
(-> (io/reader u)
453-
line-seq
454-
parse-js-ns
455-
(assoc :url u)))]
458+
([path] (load-library* path false))
459+
([path cp-only?]
460+
(let [find-func (if cp-only? find-js-classpath find-js-resources)
461+
graph-node (fn [u]
462+
(-> (io/reader u)
463+
line-seq
464+
parse-js-ns
465+
(assoc :url u)))]
456466
(let [js-sources (find-js-resources path)]
457-
(filter #(seq (:provides %)) (map graph-node js-sources)))))
467+
(filter #(seq (:provides %)) (map graph-node js-sources))))))
458468

459469
(def load-library (memoize load-library*))
460470

461-
(defn library-dependencies [{:keys [libs foreign-libs]}]
471+
(defn library-dependencies [{libs :libs foreign-libs :foreign-libs
472+
ups-libs :ups-libs ups-flibs :ups-foreign-libs}]
462473
(concat
474+
(mapcat #(load-library % true) ups-libs) ;upstream deps
463475
(mapcat load-library libs)
476+
(mapcat #(load-foreign-library % true) ups-flibs) ;upstream deps
464477
(map load-foreign-library foreign-libs)))
465478

466479
(comment
@@ -816,6 +829,16 @@
816829
"goog.provide('test');\ngoog.require('cljs.core');\nalert('hello');\n")
817830
)
818831

832+
833+
(defn get-upstream-deps*
834+
"returns a merged map containing all upstream dependencies defined by libraries on the classpath"
835+
[]
836+
(let [classloader (. (Thread/currentThread) (getContextClassLoader))
837+
upstream-deps (map #(read-string (slurp %)) (enumeration-seq (. classloader (findResources "deps.cljs"))))]
838+
(apply merge-with concat upstream-deps)))
839+
840+
(def get-upstream-deps (memoize get-upstream-deps*))
841+
819842
(defn add-header [{:keys [hashbang target]} js]
820843
(if (= :nodejs target)
821844
(str "#!" (or hashbang "/usr/bin/nodejs") "\n" js)
@@ -827,20 +850,26 @@
827850
(let [opts (if (= :nodejs (:target opts))
828851
(merge {:optimizations :simple} opts)
829852
opts)
830-
compiled (-compile source opts)
853+
ups-deps (get-upstream-deps)
854+
all-opts (assoc opts
855+
:ups-libs (:libs ups-deps)
856+
:ups-foreign-libs (:foreign-libs ups-deps)
857+
:ups-externs (:externs ups-deps))
858+
compiled (-compile source all-opts)
831859
compiled (concat
832860
(if (coll? compiled) compiled [compiled])
833-
(when (= :nodejs (:target opts))
834-
[(-compile (io/resource "cljs/nodejscli.cljs") opts)]))
861+
(when (= :nodejs (:target all-opts))
862+
[(-compile (io/resource "cljs/nodejscli.cljs") all-opts)]))
835863
js-sources (if (coll? compiled)
836-
(apply add-dependencies opts compiled)
837-
(add-dependencies opts compiled))]
838-
(if (:optimizations opts)
864+
(apply add-dependencies all-opts compiled)
865+
(add-dependencies all-opts compiled))]
866+
(println "Compiler Options:" (pr-str all-opts))
867+
(if (:optimizations all-opts)
839868
(->> js-sources
840-
(apply optimize opts)
841-
(add-header opts)
842-
(output-one-file opts))
843-
(apply output-unoptimized opts js-sources))))
869+
(apply optimize all-opts)
870+
(add-header all-opts)
871+
(output-one-file all-opts))
872+
(apply output-unoptimized all-opts js-sources))))
844873

845874
(comment
846875

src/clj/cljs/compiler.clj

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
"transient" "try" "typeof" "var" "void"
3131
"volatile" "while" "with" "yield" "methods"})
3232

33+
(def cljs-reserved-file-names #{"deps.cljs"})
34+
3335
(defonce namespaces (atom '{cljs.core {:name cljs.core}
3436
cljs.user {:name cljs.user}}))
3537

@@ -1230,7 +1232,8 @@
12301232
[dir]
12311233
(filter #(let [name (.getName ^java.io.File %)]
12321234
(and (.endsWith name ".cljs")
1233-
(not= \. (first name))))
1235+
(not= \. (first name))
1236+
(not (contains? cljs-reserved-file-names name))))
12341237
(file-seq dir)))
12351238

12361239
(defn compile-root

0 commit comments

Comments
 (0)
0