Skip to content

Commit ccab010

Browse files
author
Sergey Rublev
committed
Update clojurescript & deps. Add datascript & rum
* Reuse of `compiler-env` for faster increment re-compilation. * Support of foreign-deps https://github.com/clojure/clojurescript/wiki/Foreign-Dependencies * Fixed keywords with double colon prefix '::' Latest change requires re-import database if lib uses double colon keywords. (for `example` rum or `datascript`)
1 parent 9565ccf commit ccab010

File tree

7 files changed

+108
-38
lines changed

7 files changed

+108
-38
lines changed

project.clj

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22
:description "CLJSFiddle"
33
:url "http://cljsfiddle.net"
44
:dependencies [[org.clojure/clojure "1.6.0"]
5-
[org.clojure/clojurescript "0.0-2227"]
5+
[org.clojure/clojurescript "0.0-2850"]
66
[org.clojure/tools.reader "0.8.4"]
77
[org.clojure/core.match "0.2.1"]
8-
[org.clojure/core.async "0.1.303.0-886421-alpha"]
8+
[org.clojure/core.async "0.1.346.0-17112a-alpha"]
99
[org.clojure/core.logic "0.8.7"]
1010
[org.clojure/tools.macro "0.1.5"]
11-
[com.datomic/datomic-free "0.9.4815"]
11+
[com.datomic/datomic-free "0.9.5130"]
1212
[ring/ring-jetty-adapter "1.3.0"]
1313
[ring/ring-devel "1.3.0"]
1414
[fogus/ring-edn "0.2.0"]
@@ -21,16 +21,19 @@
2121
[environ "0.5.0"]
2222
[com.taoensso/timbre "3.2.1"]
2323
[hylla "0.2.0"]
24-
[domina "1.0.2"]
25-
[prismatic/dommy "0.1.2"]
24+
[domina "1.0.3"]
25+
[prismatic/dommy "1.0.0"]
26+
[org.omcljs/om "0.8.8"]
27+
[reagent "0.5.0-alpha3"]
28+
[quiescent "0.1.4"]
2629
[hiccups "0.3.0"]
27-
[cljs-ajax "0.2.4"]
28-
[om "0.6.4"]
29-
[quiescent "0.1.3"]
30-
[reagent "0.4.2"]]
30+
[cljs-ajax "0.3.10"]
31+
[rum "0.2.5"]
32+
[datascript "0.9.0"]
33+
]
3134
:source-paths ["src/clj" "src/cljs"]
3235
:plugins [[lein-ring "0.8.10"]
33-
[lein-cljsbuild "1.0.3"]]
36+
[lein-cljsbuild "1.0.4"]]
3437
; :main cljsfiddle.handler
3538
; :uberjar-name "cljsfiddle-standalone.jar"
3639
:min-lein-version "2.0.0"
@@ -43,7 +46,7 @@
4346
:source-paths ["src/cljs"]
4447
:compiler {:output-to "resources/public/js/app.js"
4548
:output-dir "resources/public/js/out-dev"
46-
:source-map true
49+
:source-map "resources/public/js/app.js.map"
4750
:optimizations :simple
4851
:pretty-print true}}
4952
:prod {

src/clj/cljsfiddle/closure.clj

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
[cljsfiddle.db.src :as src]
99
[cljs.closure :as cljs]
1010
[cljs.env :as cljs-env]
11+
[cljsfiddle.compiler :refer [compiler-env]]
1112
[taoensso.timbre :as log]
1213
[clojure.pprint :refer [pprint]]
1314
[datomic.api :as d]
@@ -17,7 +18,7 @@
1718
[java.util.logging Level]
1819
[java.io StringReader BufferedReader]
1920
[com.google.javascript.jscomp.Compiler]
20-
[com.google.javascript.jscomp JSSourceFile
21+
[com.google.javascript.jscomp SourceFile
2122
CompilerOptions
2223
CompilationLevel
2324
ClosureCodingConvention]))
@@ -32,8 +33,7 @@
3233

3334
(defn compile-cljs* [cljs-src-str]
3435
(let [cljs-src (read-all cljs-src-str)
35-
js-src (cljs-env/with-compiler-env
36-
(cljs-env/default-compiler-env)
36+
js-src (cljs-env/with-compiler-env compiler-env
3737
(cljs/-compile cljs-src {}))]
3838
js-src))
3939

@@ -53,8 +53,8 @@
5353
(.setOptionsForCompilationLevel level compiler-options)
5454
compiler-options)
5555
compiler (com.google.javascript.jscomp.Compiler.)
56-
src (JSSourceFile/fromCode name src)
57-
externs (JSSourceFile/fromCode "externs" "")
56+
src (SourceFile/fromCode name src)
57+
externs (SourceFile/fromCode "externs" "")
5858
result (.compile compiler externs src options)]
5959
(if (.success result)
6060
(merge {:status :success
@@ -81,7 +81,11 @@
8181
tdb (:db-after (d/with db (:tx cljs-tx)))
8282
deps (db/dependency-files tdb (:ns cljs-obj))
8383
js-src-obj (closure-compile (:js-src cljs-obj))
84-
js-src-obj (assoc js-src-obj :dependencies deps :status :ok)]
84+
js-src-obj (assoc js-src-obj
85+
:dependencies deps
86+
:deps-src (:deps-src cljs-obj)
87+
:status :ok)]
88+
8589
(edn-response js-src-obj))
8690
(catch clojure.lang.ExceptionInfo e
8791
(edn-response

src/clj/cljsfiddle/compiler.clj

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
(ns cljsfiddle.compiler
2+
(:require [cljs.closure :as closure]
3+
[cljs.js-deps :as deps]
4+
[cljs.env :as cljs-env]
5+
[cljs.compiler :as compiler]))
6+
7+
8+
(let [ups-deps (closure/get-upstream-deps)
9+
opts {:ups-libs (:libs ups-deps)
10+
:ups-foreign-libs (:foreign-libs ups-deps)
11+
:ups-externs (:externs ups-deps)}
12+
13+
env (cljs-env/default-compiler-env opts)]
14+
15+
(swap! env assoc :js-dependency-index (deps/js-dependency-index opts))
16+
17+
(def compiler-env env))

src/clj/cljsfiddle/db/util.clj

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,13 @@
33
[clojure.java.io :as io]
44
[clojure.tools.reader :as reader]
55
[datomic.api :as d]
6+
[cljs.analyzer :as ana]
67
[cljs.env :as cljs-env]
78
[cljs.closure :as closure]
89
[cljs.js-deps :as cljs-deps]
10+
[cljsfiddle.compiler :refer [compiler-env]]
911
[cljs.tagged-literals :as tags]
12+
[taoensso.timbre :as log]
1013
[environ.core :refer (env)])
1114
(:import [clojure.lang LineNumberingPushbackReader]
1215
[java.io StringReader BufferedReader]
@@ -37,14 +40,40 @@
3740
line-seq
3841
cljs-deps/parse-js-ns))
3942

43+
(comment
44+
(defn log-time [prev txt]
45+
(let [cur (System/nanoTime)
46+
diff (- cur prev)
47+
ms (-> diff
48+
(/ 1000000) int)]
49+
(log/trace (format "%dms | %s" ms txt))
50+
cur)))
51+
4052
(defn cljs-object-from-src [cljs-src-str]
41-
(let [cljs-src (read-all cljs-src-str)
42-
js-src (cljs-env/with-compiler-env
43-
(cljs-env/default-compiler-env)
44-
(closure/-compile cljs-src {})) ;; TODO perf.
53+
(let [parsed-ns (ana/parse-ns
54+
(-> cljs-src-str
55+
StringReader.
56+
BufferedReader.))
57+
cljs-src-str (s/replace cljs-src-str
58+
#"::"
59+
(format ":%s/"
60+
(-> parsed-ns :ns name)))
61+
cljs-src (read-all cljs-src-str)
62+
[deps-src js-src]
63+
(cljs-env/with-compiler-env compiler-env
64+
(let [opts {}
65+
66+
compiled (closure/-compile cljs-src opts)
67+
js-sources (closure/add-dependencies opts compiled)
68+
fdeps-str (closure/foreign-deps-str
69+
opts
70+
(filter closure/foreign-source? js-sources))]
71+
72+
[fdeps-str compiled]))
4573
{:keys [provides requires]} (parse-js-ns js-src)]
4674
{:src cljs-src-str
4775
:js-src js-src
76+
:deps-src deps-src
4877
:sha (sha cljs-src-str)
4978
:ns (first provides)
5079
:requires (set requires)}))

src/clj/cljsfiddle/import.clj

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,15 @@
2121
(let [uri (or uri
2222
(env :datomic-uri)
2323
"datomic:free://localhost:4334/cljsfiddle")]
24+
(prn "creating db")
2425
(d/create-database uri)
26+
(prn "ok")
2527
(let [conn (d/connect uri)]
26-
@(d/transact conn schema))))
28+
(prn "creating schema")
29+
@(d/transact conn schema)
30+
(prn "ok")
31+
(System/exit 0)
32+
)))
2733

2834
;; Import js and cljs from the classpath into datomic.
2935

@@ -74,8 +80,11 @@
7480
;; TODO: Figure out if schema is installed.
7581
(defn -main [uri]
7682
(let [conn (d/connect uri)
77-
files (find-files #{"cljs/" "clojure/" "goog/" "domina" "hiccups"
78-
"dommy" "om" "quiescent" "reagent"}
83+
files (find-files #{"cljs/" "clojure/" "goog/" "domina" "hiccups"
84+
"cljsjs"
85+
"react" "om" "quiescent" "reagent"
86+
"rum" "sablono" "datascript"
87+
"dommy"}
7988
(filter #(.endsWith % ".jar")
8089
(-> "java.class.path"
8190
System/getProperty
@@ -86,12 +95,13 @@
8695
cljs-objects (map cljs-object-from-file cljs-files)]
8796
(println "transacting cljs")
8897
(doseq [cljs cljs-objects]
98+
(pr "Considering " (:file cljs) "... ")
99+
(flush)
89100
(let [cljs-tx (:tx (src/cljs-tx (d/db conn) cljs))]
90-
(print "Considering " (:file cljs) "... ")
91101
(if-not (empty? cljs-tx)
92102
(do @(d/transact conn cljs-tx)
93-
(println "transacted."))
94-
(println "skipped.")
103+
(prn "transacted."))
104+
(prn "skipped.")
95105
)))
96106
(println "done.")
97107
(println "transacting js")
@@ -116,7 +126,8 @@
116126

117127
(println "Running storage GC")
118128
(d/gc-storage conn (Date.))
119-
(println "Done.")))
129+
(println "Done."))
130+
(System/exit 0))
120131

121132
;; (-main (env :datomic-uri))
122133

src/clj/cljsfiddle/views.clj

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
(ns cljsfiddle.views
22
(:require [hiccup.util :refer (escape-html)]
33
[environ.core :refer (env)]
4-
[cljsfiddle.closure :refer [compile-cljs*]]))
4+
[cljsfiddle.db.util :refer [cljs-object-from-src]]))
55

66
(def google-analytics-script
77
"(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
@@ -113,6 +113,11 @@
113113
[:a {:href "http://cljsfiddle.net"} "cljsfiddle.net"] " © 2013 Jonas Enlund"]]]))
114114

115115
(defn html-view [ns fiddle deps]
116+
(let [cljs-obj (-> fiddle
117+
:cljsfiddle/cljs
118+
:cljsfiddle.src/blob
119+
:cljsfiddle.blob/text
120+
cljs-object-from-src)]
116121
[:html
117122
[:head
118123
[:title ns]
@@ -128,14 +133,10 @@
128133
:cljsfiddle.blob/text)
129134
[:script "CLOSURE_NO_DEPS=true;"]
130135
[:script "COMPILED=true;"]
136+
[:script (:deps-src cljs-obj)]
131137
(for [dep deps]
132138
[:script {:src (str "/jscache/" (env :cljsfiddle-version) "/" dep)}])
133-
[:script
134-
(-> fiddle
135-
:cljsfiddle/cljs
136-
:cljsfiddle.src/blob
137-
:cljsfiddle.blob/text
138-
compile-cljs*)]]])
139+
[:script (:js-src cljs-obj)]]]))
139140

140141
(defn about-view [user]
141142
(base (navbar user)

src/cljs/cljsfiddle/core.cljs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
(ns cljsfiddle.core
2+
(:require-macros [hiccups.core :as hiccups])
23
(:require [clojure.string :as s]
34
[cljs.reader :as reader]
45
[domina :as dom]
@@ -21,14 +22,15 @@
2122
[:script {:src (str "/jscache/" version "/" (s/replace dep ".cljs" ".js"))}])]
2223
(apply str (map render-html (concat html ds)))))
2324

24-
(defn make-srcdoc [html css js deps version]
25-
(render-html
25+
(defn make-srcdoc [html css js deps-src deps version]
26+
(hiccups/html
2627
[:html
2728
[:head
2829
[:style css]]
2930
[:body
3031
[:script "window.onerror = function(msg, url, line) { parent.postMessage('{:type :runtime-error}', '*'); return false;};"]
3132
html
33+
[:script (or deps-src "")]
3234
(make-deps deps version)
3335
[:script "cljs.core.set_print_fn_BANG_.call(null,function(s){var s = s.replace(/\"/g, \""\"); parent.postMessage('{:type :runtime-print :to-print \"' + s + '\"}', '*');});"]
3436
[:script js]
@@ -99,7 +101,7 @@
99101
">" ">"})])
100102

101103
(defn output-html [msg]
102-
(render-html (output-hiccup msg)))
104+
(hiccups/html (output-hiccup msg)))
103105

104106
(defn output-fn []
105107
(let [out (dom/by-id "output")]
@@ -156,13 +158,15 @@
156158
(dom/add-class! run-btn "disabled")
157159
(http/POST "/compiler/compile"
158160
{:params {:src (.getValue cljs-editor)}
161+
:format :edn
159162
:handler (fn [res]
160163
(dom/remove-class! run-btn "disabled")
161164
(condp = (:status res)
162165
:ok
163166
(let [srcdoc (make-srcdoc (.getValue html-editor)
164167
(.getValue css-editor)
165168
(:js-src res)
169+
(:deps-src res)
166170
(:dependencies res)
167171
version)]
168172
(.setAttribute result-frame "srcdoc" srcdoc))
@@ -174,6 +178,7 @@
174178
{:params {:cljs (.getValue cljs-editor)
175179
:html (.getValue html-editor)
176180
:css (.getValue css-editor)}
181+
:format :edn
177182
:handler (fn [res]
178183
(dom/remove-class! save-btn "disabled")
179184
(if (= (:status res) :success)

0 commit comments

Comments
 (0)