8000 Merge branch 'master' of github.com:clojure/clojurescript · clojure/clojurescript@e8c55da · GitHub
[go: up one dir, main page]

Skip to content

Commit e8c55da

Browse files
committed
Merge branch 'master' of github.com:clojure/clojurescript
2 parents f099ee9 + f6c7386 commit e8c55da

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,24 @@
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)]
164169
(if use-only-custom-externs
165-
js-sources
166-
(into js-sources (CommandLineRunner/getDefaultExterns))))))
170+
all-sources
171+
(into all-sources (CommandLineRunner/getDefaultExterns))))))
167172

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

444451
(def load-foreign-library (memoize load-foreign-library*))
445452

446453
(defn load-library*
447454
"Given a path to a JavaScript library, which is a directory
448455
containing Javascript files, return a list of maps
449456
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)))]
457+
([path] (load-library* path false))
458+
([path cp-only?]
459+
(let [find-func (if cp-only? find-js-classpath find-js-resources)
460+
graph-node (fn [u]
461+
(-> (io/reader u)
462+
line-seq
463+
parse-js-ns
464+
(assoc :url u)))]
456465
(let [js-sources (find-js-resources path)]
457-
(filter #(seq (:provides %)) (map graph-node js-sources)))))
466+
(filter #(seq (:provides %)) (map graph-node js-sources))))))
458467

459468
(def load-library (memoize load-library*))
460469

461-
(defn library-dependencies [{:keys [libs foreign-libs]}]
470+
(defn library-dependencies [{libs :libs foreign-libs :foreign-libs
471+
ups-libs :ups-libs ups-flibs :ups-foreign-libs}]
462472
(concat
473+
(mapcat #(load-library % true) ups-libs) ;upstream deps
463474
(mapcat load-library libs)
475+
(mapcat #(load-foreign-library % true) ups-flibs) ;upstream deps
464476
(map load-foreign-library foreign-libs)))
465477

466478
(comment
@@ -816,6 +828,18 @@
816828
"goog.provide('test');\ngoog.require('cljs.core');\nalert('hello');\n")
817829
)
818830

831+
832+
(defn get-upstream-deps*
833+
"returns a merged map containing all upstream dependencies defined by libraries on the classpath"
834+
[]
835+
(let [classloader (. (Thread/currentThread) (getContextClassLoader))
836+
upstream-deps (map #(read-string (slurp %)) (enumeration-seq (. classloader (findResources "deps.cljs"))))]
837+
(doseq [dep upstream-deps]
838+
(println (str "Upstream deps.cljs found on classpath. " dep " This is an EXPERIMENTAL FEATURE and is not guarenteed to remain stable in future versions.")))
839+
(apply merge-with concat upstream-deps)))
840+
841+
(def get-upstream-deps (memoize get-upstream-deps*))
842+
819843
(defn add-header [{:keys [hashbang target]} js]
820844
(if (= :nodejs target)
821845
(str "#!" (or hashbang "/usr/bin/nodejs") "\n" js)
@@ -827,20 +851,25 @@
827851
(let [opts (if (= :nodejs (:target opts))
828852
(merge {:optimizations :simple} opts)
829853
opts)
830-
compiled (-compile source opts)
854+
ups-deps (get-upstream-deps)
855+
all-opts (assoc opts
856+
:ups-libs (:libs ups-deps)
857+
:ups-foreign-libs (:foreign-libs ups-deps)
858+
:ups-externs (:externs ups-deps))
859+
compiled (-compile source all-opts)
831860
compiled (concat
832861
(if (coll? compiled) compiled [compiled])
833-
(when (= :nodejs (:target opts))
834-
[(-compile (io/resource "cljs/nodejscli.cljs") opts)]))
862+
(when (= :nodejs (:target all-opts))
863+
[(-compile (io/resource "cljs/nodejscli.cljs") all-opts)]))
835864
js-sources (if (coll? compiled)
836-
(apply add-dependencies opts compiled)
837-
(add-dependencies opts compiled))]
838-
(if (:optimizations opts)
865+
(apply add-dependencies all-opts compiled)
866+
(add-dependencies all-opts compiled))]
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