Skip to content

Commit 1a21fd2

Browse files
anmonteiroswannodette
authored andcommitted
CLJS-2286: Simplify JS module processing
1 parent 9ac09b2 commit 1a21fd2

File tree

7 files changed

+29
-43
lines changed

7 files changed

+29
-43
lines changed

.travis.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ before_install:
1515
before_script:
1616
- script/bootstrap
1717
- mkdir -p builds/out-adv
18-
- bin/cljsc src/test/cljs "{:optimizations :advanced :output-wrapper true :verbose true :compiler-stats true :parallel-build true :output-dir \"builds/out-adv\" :npm-deps {:lodash \"4.17.4\"} :closure-warnings {:non-standard-jsdoc :off :global-this :off} :install-deps true :foreign-libs [{:file \"src/test/cljs/calculator_global.js\" :provides [\"calculator\"] :global-exports {calculator Calculator}}]}" > builds/out-adv/core-advanced-test.js
18+
- bin/cljsc src/test/cljs "{:optimizations :advanced :output-wrapper true :verbose true :compiler-stats true :parallel-build true :output-dir \"builds/out-adv\" :npm-deps {:lodash \"4.17.4\"} :closure-warnings {:non-standard-jsdoc :off :global-this :off} :install-deps true :foreign-libs [{:file \"src/test/cljs/calculator_global.js\" :provides [\"calculator\"] :global-exports {calculator Calculator}} {:file \"src/test/cljs/es6_dep.js\" :module-type :es6 :provides [\"es6_calc\"]} {:file \"src/test/cljs/calculator_amd.js\" :module-type :amd :provides [\"calculator_amd\"] :requires [\"es6_calc\"]}]}" > builds/out-adv/core-advanced-test.js
1919

2020
script:
2121
- lein test

script/test

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ mkdir -p builds/out-adv
1212
possible=5
1313
ran=0
1414

15-
if ! bin/cljsc src/test/cljs "{:optimizations :advanced :output-wrapper true :verbose true :compiler-stats true :parallel-build true :output-dir \"builds/out-adv\" :npm-deps {:lodash \"4.17.4\"} :closure-warnings {:non-standard-jsdoc :off :global-this :off} :install-deps true :foreign-libs [{:file \"src/test/cljs/calculator_global.js\" :provides [\"calculator\"] :global-exports {calculator Calculator}}]}" > builds/out-adv/core-advanced-test.js; then
15+
if ! bin/cljsc src/test/cljs "{:optimizations :advanced :output-wrapper true :verbose true :compiler-stats true :parallel-build true :output-dir \"builds/out-adv\" :npm-deps {:lodash \"4.17.4\"} :closure-warnings {:non-standard-jsdoc :off :global-this :off} :install-deps true :foreign-libs [{:file \"src/test/cljs/calculator_global.js\" :provides [\"calculator\"] :global-exports {calculator Calculator}} {:file \"src/test/cljs/es6_dep.js\" :module-type :es6 :provides [\"es6_calc\"]} {:file \"src/test/cljs/calculator_amd.js\" :module-type :amd :provides [\"calculator_amd\"] :requires [\"es6_calc\"]}]}" > builds/out-adv/core-advanced-test.js; then
1616
>&2 echo ClojureScript compilation failed
1717
exit 1
1818
fi;

script/test-simple

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ possible=5
1212
ran=0
1313

1414
#bin/cljsc test >out/core-test.js
15-
if ! bin/cljsc src/test/cljs "{:optimizations :simple :static-fns true :output-dir \"builds/out-simp\" :cache-analysis true :output-wrapper true :verbose true :compiler-stats true :npm-deps {:lodash \"4.17.4\"} :closure-warnings {:non-standard-jsdoc :off :global-this :off} :install-deps true :foreign-libs [{:file \"src/test/cljs/calculator_global.js\" :provides [\"calculator\"] :global-exports {calculator Calculator}}]}" > builds/out-simp/core-simple-test.js; then
15+
if ! bin/cljsc src/test/cljs "{:optimizations :simple :static-fns true :output-dir \"builds/out-simp\" :cache-analysis true :output-wrapper true :verbose true :compiler-stats true :npm-deps {:lodash \"4.17.4\"} :closure-warnings {:non-standard-jsdoc :off :global-this :off} :install-deps true :foreign-libs [{:file \"src/test/cljs/calculator_global.js\" :provides [\"calculator\"] :global-exports {calculator Calculator}} {:file \"src/test/cljs/es6_dep.js\" :module-type :es6 :provides [\"es6_calc\"]} {:file \"src/test/cljs/calculator_amd.js\" :module-type :amd :provides [\"calculator_amd\"] :requires [\"es6_calc\"]}]}" > builds/out-simp/core-simple-test.js; then
1616
>&2 echo ClojureScript compilation failed
1717
exit 1
1818
fi;

src/main/clojure/cljs/closure.clj

Lines changed: 13 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1605,16 +1605,6 @@
16051605
(js-source-file file (deps/-source lib))))
16061606
js-modules))
16071607

1608-
(defmulti convert-js-modules
1609-
"Takes a list JavaScript modules as an IJavaScript and rewrites them into a Google
1610-
Closure-compatible form. Returns list IJavaScript with the converted module
1611-
code set as source."
1612-
(fn [module-type js-modules opts]
1613-
(if (= module-type :amd)
1614-
;; AMD modules are converted via CommonJS modules
1615-
:commonjs
1616-
module-type)))
1617-
16181608
(defn make-convert-js-module-options [opts]
16191609
(-> opts
16201610
(select-keys
@@ -1642,25 +1632,18 @@
16421632
(assoc ijs :source
16431633
(.toSource closure-compiler ^Node (get result-nodes processed-file)))))
16441634

1645-
(defmethod convert-js-modules :commonjs [module-type js-modules opts]
1646-
(let [^List externs '()
1647-
^List source-files (get-source-files js-modules opts)
1648-
^CompilerOptions options (doto (make-convert-js-module-options opts)
1649-
(.setProcessCommonJSModules true)
1650-
(.setTransformAMDToCJSModules (= module-type :amd)))
1651-
closure-compiler (doto (make-closure-compiler)
1652-
(.init externs source-files options))]
1653-
(.parse closure-compiler)
1654-
(report-failure (.getResult closure-compiler))
1655-
(map (partial add-converted-source
1656-
closure-compiler (get-closure-sources closure-compiler) opts)
1657-
js-modules)))
1658-
1659-
(defmethod convert-js-modules :es6 [module-type js-modules opts]
1635+
(defn convert-js-modules
1636+
"Takes a list JavaScript modules as an IJavaScript and rewrites them into a Google
1637+
Closure-compatible form. Returns list IJavaScript with the converted module
1638+
code set as source."
1639+
[js-modules opts]
16601640
(let [^List externs '()
16611641
^List source-files (get-source-files js-modules opts)
16621642
^CompilerOptions options (doto (make-convert-js-module-options opts)
16631643
(.setProcessCommonJSModules true)
1644+
(.setTransformAMDToCJSModules
1645+
(boolean (some (fn [{:keys [module-type]}]
1646+
(= module-type :amd)) js-modules)))
16641647
(.setLanguageIn (lang-key->lang-mode :ecmascript6))
16651648
(.setLanguageOut (lang-key->lang-mode (:language-out opts :ecmascript3))))
16661649
closure-compiler (doto (make-closure-compiler)
@@ -1674,10 +1657,6 @@
16741657
closure-compiler (get-closure-sources closure-compiler) opts)
16751658
js-modules)))
16761659

1677-
(defmethod convert-js-modules :default [module-type js-modules opts]
1678-
(ana/warning :unsupported-js-module-type @env/*compiler* (first js-modules))
1679-
js-modules)
1680-
16811660
(defmulti js-transforms
16821661
"Takes an IJavaScript with the source code set as source, transforms the
16831662
source code and returns an IJavascript with the new code set as source."
@@ -2327,7 +2306,10 @@
23272306
(if (seq js-modules)
23282307
(util/measure (:compiler-stats opts)
23292308
"Process JS modules"
2330-
(let [;; Load all modules - add :source so preprocessing and conversion can access it
2309+
(let [_ (when-let [unsupported (first (filter (complement #{:es6 :commonjs :amd})
2310+
(map :module-type js-modules)))]
2311+
(ana/warning :unsupported-js-module-type @env/*compiler* unsupported))
2312+
;; Load all modules - add :source so preprocessing and conversion can access it
23312313
js-modules (map (fn [lib]
23322314
(let [js (deps/load-foreign-library lib)]
23332315
(assoc js :source (deps/-source js opts))))
@@ -2337,15 +2319,7 @@
23372319
(preprocess-js js opts)
23382320
js))
23392321
js-modules)
2340-
;; Conversion is done per module-type, because Compiler needs to process e.g. all CommonJS
2341-
;; modules on one go, so it can handle the dependencies between modules.
2342-
;; Amdjs modules are converted separate from CommonJS modules so they can't
2343-
;; depend on each other.
2344-
modules-per-type (group-by :module-type js-modules)
2345-
js-modules (mapcat (fn [[module-type js-modules]]
2346-
(convert-js-modules module-type js-modules opts))
2347-
modules-per-type)]
2348-
2322+
js-modules (convert-js-modules js-modules opts)]
23492323
;; Write modules to disk, update compiler state and build new options
23502324
(reduce (fn [new-opts {:keys [file] :as ijs}]
23512325
(let [ijs (write-javascript opts ijs)

src/test/cljs/calculator_amd.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
define({
2+
add: function(x, y){
3+
return x + y;
4+
}
5+
});

src/test/cljs/cljs/npm_deps_test.cljs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
(:refer-clojure :exclude [array vector])
33
(:require [cljs.test :refer [deftest is]]
44
["lodash/array" :as array :refer [slice] :rename {slice slc}]
5-
[calculator :as vector :refer [add] :rename {add plus}]))
5+
[calculator :as vector :refer [add] :rename {add plus}]
6+
[es6_calc]))
67

78
(def array #js [1 2 3])
89

@@ -21,3 +22,6 @@
2122
(is (= (array-seq array) [1 2 3]))
2223
;; same should happen with global-exports
2324
(is (= vector [1])))
25+
26+
(deftest test-cljs-2286
27+
(is (= 3 (es6_calc/calculator.add 1 2))))

src/test/cljs/es6_dep.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import * as calc from './calculator_amd';
2+
3+
export var calculator = calc;

0 commit comments

Comments
 (0)