-
Notifications
You must be signed in to change notification settings - Fork 1
/
cljs.clj
110 lines (91 loc) · 2.86 KB
/
cljs.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
(ns dar.assets.cljs
(:refer-clojure :exclude [compile])
(:require [cljs.closure :as closure]
[cljs.env :as cljs-env]
[clojure.string :as string]
[clojure.java.io :as io]
[dar.container :refer :all]
[dar.assets.util :as util]))
(defn ns->path [ns]
(string/replace (namespace-munge ns) \. \/))
(defn- compile-js [path opts]
(when-let [js (io/resource (str path ".js"))]
(let [target (io/file (:output-dir opts) (str path ".js"))]
(get-in (swap! (::env opts) update-in [::cache path]
(fn [script]
(if (or
(when (util/outdate? target js)
(util/cp js target)
true)
(not script))
(closure/read-js target)
script)))
[::cache path]))))
(defn- compile-clj [path opts]
(when-let [clj (io/resource (str path ".cljs"))]
(closure/-compile clj
(assoc opts :output-file (str path ".js")))))
(defn- compile-ns [ns opts]
(let [path (ns->path ns)]
(or
(compile-js path opts)
(compile-clj path opts))))
(defn compile [namespaces opts]
(util/topo-visit
:requires
#(compile-ns % opts)
(fn [scripts js]
(if js
(conj scripts js)
scripts))
[]
namespaces))
(application development)
(define :cljs/options nil)
(define ::env
:level :env
:fn #(cljs-env/default-compiler-env))
(define :cljs/build-dir
:args [:assets/public-dir]
:fn identity)
(define ::default-options {:optimizations :none
:source-map true
:warnings false})
(define ::opts
:args [:cljs/build-dir :cljs/options ::default-options]
:fn (fn [dir opts defaults]
(merge
defaults
opts
{:output-dir dir})))
(define ::build
:args [::opts ::env :cljs/main]
:fn (fn [opts env main]
(closure/build (reify closure/Compilable
(-compile [_ opts] (compile [main] opts)))
(assoc opts ::env env)
env)))
(define :cljs/main-script
:args [:cljs/main]
:fn (fn [main]
(when main
[:script (str (namespace-munge (str main)) "._main()")])))
(define ::scripts
:args [::build :cljs/main :assets/public-url]
:fn (fn [deps-js main prefix]
[[:script {:src (util/join prefix "goog/base.js")}]
[:script deps-js]
[:script (str "goog.require('" (namespace-munge (name main)) "')")]]))
(define :cljs/scripts
:args [:cljs/main :dar.container/self]
:fn (fn [main app]
(when main
(evaluate app ::scripts))))
(application production-patch)
(define :cljs/build-dir)
(define ::default-options {:optimizations :advanced
:warnings false})
(define ::scripts
:args [::build]
:fn (fn [js]
[[:script js]]))