Skip to content

Commit 427aaba

Browse files
r0manswannodette
authored andcommitted
CLJS-2650: Fix JAR compilation of cljs.loader
The cljs.loader file needs to be compiled after all other files to populate the `module-infos` and `module-uris` vars. The `requires-compilation?` function returned false if the file to compile was cljs.loader and didn't contain a :cache-key. This prevented `compile-from-jar` from moving the cljs.loader from the JAR file to the disk and caused a java.io.FileNotFoundException later on. Since cljs.loader always get compiled in a later pass, we decided to remove this special logic. Since this behaviour only happens when compiling from a JAR, I added a test that uses the cljs.jar to compile the example from the Code Splitting guide.
1 parent 0525655 commit 427aaba

7 files changed

Lines changed: 103 additions & 20 deletions

File tree

src/main/clojure/cljs/compiler.cljc

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1093,7 +1093,7 @@
10931093

10941094
(or fn? js? goog?)
10951095
(emits f "(" (comma-sep args) ")")
1096-
1096+
10971097
:else
10981098
(if (and ana/*cljs-static-fns* (= (:op f) :var))
10991099
;; higher order case, static information missing
@@ -1477,24 +1477,22 @@
14771477
(:options @env/*compiler*))))
14781478
([^File src ^File dest opts]
14791479
(let [{:keys [ns requires]} (ana/parse-ns src)]
1480-
(if (and (= 'cljs.loader ns) (not (contains? opts :cache-key)))
1481-
false
1482-
(ensure
1483-
(or (not (.exists dest))
1484-
(util/changed? src dest)
1485-
(let [version' (util/compiled-by-version dest)
1486-
version (util/clojurescript-version)]
1487-
(and version (not= version version')))
1488-
(and opts
1489-
(not (and (io/resource "cljs/core.aot.js") (= 'cljs.core ns)))
1490-
(not= (ana/build-affecting-options opts)
1491-
(ana/build-affecting-options (util/build-options dest))))
1492-
(and opts (:source-map opts)
1493-
(if (= (:optimizations opts) :none)
1494-
(not (.exists (io/file (str (.getPath dest) ".map"))))
1495-
(not (get-in @env/*compiler* [::compiled-cljs (.getAbsolutePath dest)]))))
1496-
(when-let [recompiled' (and *recompiled* @*recompiled*)]
1497-
(some requires recompiled')))))))))
1480+
(ensure
1481+
(or (not (.exists dest))
1482+
(util/changed? src dest)
1483+
(let [version' (util/compiled-by-version dest)
1484+
version (util/clojurescript-version)]
1485+
(and version (not= version version')))
1486+
(and opts
1487+
(not (and (io/resource "cljs/core.aot.js") (= 'cljs.core ns)))
1488+
(not= (ana/build-affecting-options opts)
1489+
(ana/build-affecting-options (util/build-options dest))))
1490+
(and opts (:source-map opts)
1491+
(if (= (:optimizations opts) :none)
1492+
(not (.exists (io/file (str (.getPath dest) ".map"))))
1493+
(not (get-in @env/*compiler* [::compiled-cljs (.getAbsolutePath dest)]))))
1494+
(when-let [recompiled' (and *recompiled* @*recompiled*)]
1495+
(some requires recompiled'))))))))
14981496

14991497
#?(:clj
15001498
(defn compile-file
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<html>
2+
<body>
3+
<button id="button">Load Bar!</button>
4+
<script src="out/cljs_base.js" type="text/javascript"></script>
5+
<script src="out/foo.js" type="text/javascript"></script>
6+
</body>
7+
</html>
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
(require '[cljs.build.api :as b])
2+
3+
(b/build "src"
4+
{:output-dir "out"
5+
:asset-path "/out"
6+
:optimizations :advanced
7+
:verbose true
8+
:modules {:foo {:entries '#{foo.core}
9+
:output-to "out/foo.js"}
10+
:bar {:entries '#{bar.core}
11+
:output-to "out/bar.js"}}})
12+
13+
(System/exit 0)
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
(require '[cljs.repl :as r])
2+
(require '[cljs.build.api :as b])
3+
(require '[cljs.repl.browser :as rb])
4+
5+
(def opts
6+
{:watch "src"
7+
:output-dir "out"
8+
:asset-path "/out"
9+
:optimizations :none
10+
:modules {:foo {:entries '#{foo.core}
11+
:output-to "out/foo.js"}
12+
:bar {:entries '#{bar.core}
13+
:output-to "out/bar.js"}}
14+
:browser-repl true
15+
:verbose true})
16+
17+
(b/build "src" opts)
18+
(r/repl* (rb/repl-env) opts)
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
(ns bar.core
2+
(:require [cljs.loader :as loader]))
3+
4+
(enable-console-print!)
5+
6+
(println "I'm bar!")
7+
8+
(defn woz []
9+
(println "WOZ!"))
10+
11+
(loader/set-loaded! :bar)
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
(ns foo.core
2+
(:require [goog.dom :as gdom]
3+
[goog.events :as events]
4+
[cljs.loader :as loader])
5+
(:import [goog.events EventType]))
6+
7+
(enable-console-print!)
8+
9+
(println "I'm foo!")
10+
11+
(events/listen (gdom/getElement "button") EventType.CLICK
12+
(fn [e]
13+
(loader/load :bar
14+
(fn []
15+
((resolve 'bar.core/woz))))))
16+
17+
(loader/set-loaded! :foo)

src/test/cljs_cli/cljs_cli/test.clj

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
(ns cljs-cli.test
22
(:require
3-
[clojure.test :refer [deftest]]
3+
[clojure.test :refer [deftest is]]
44
[clojure.java.io :as io]
55
[clojure.java.shell :as shell :refer [with-sh-dir]]
6+
[clojure.string :as str]
67
[cljs-cli.util :refer [cljs-main output-is with-sources with-post-condition with-repl-env-filter]]))
78

89
(deftest eval-test
@@ -68,3 +69,21 @@
6869
(output-is "default-value"))
6970
(-> (cljs-main "-co" "{:closure-defines {foo.core/configurable \"configured-value\"}}" "-m" "foo.core")
7071
(output-is "configured-value"))))
72+
73+
(deftest test-cljs-2650-loader-does-not-exists
74+
(doseq [optimizations [:none :advanced]]
75+
(let [src (io/file "src" "test" "cljs_build" "hello-modules" "src")
76+
opts {:output-dir "out"
77+
:asset-path "/out"
78+
:optimizations optimizations
79+
:modules {:foo {:entries '#{foo.core}
80+
:output-to "out/foo.js"}
81+
:bar {:entries '#{bar.core}
82+
:output-to "out/bar.js"}}}]
83+
(with-sources
84+
{"src/foo/core.cljs" (slurp (io/file src "foo" "core.cljs"))
85+
"src/bar/core.cljs" (slurp (io/file src "bar" "core.cljs"))}
86+
(let [result (cljs-main "--compile-opts" (pr-str opts)
87+
"--compile" "foo.core")]
88+
(is (zero? (:exit result)))
89+
(is (str/blank? (:err result))))))))

0 commit comments

Comments
 (0)