/src/cljs_devmode/core.clj

http://github.com/maxweber/cljs-devmode · Clojure · 74 lines · 60 code · 13 blank · 1 comment · 9 complexity · 87eb7eb9d85e112e972d3674a9bc6835 MD5 · raw file

  1. (ns cljs-devmode.core
  2. (:use ring.util.response
  3. ring.middleware.file
  4. clojure.set
  5. ring.adapter.jetty)
  6. (:import java.io.File))
  7. (defn clojurescript-source-file?
  8. "Returns true if file is a normal file with a .cljs extension."
  9. [^File file]
  10. (and (.isFile file)
  11. (.endsWith (.getName file) ".cljs")))
  12. (defn find-clojurescript-sources-in-dir
  13. "Searches recursively under dir for ClojureScript source files (.cljs).
  14. Returns a sequence of File objects, in breadth-first sort order."
  15. [^File dir]
  16. ;; Use sort by absolute path to get breadth-first search.
  17. (sort-by #(.getAbsolutePath %)
  18. (filter clojurescript-source-file? (file-seq dir))))
  19. (defn handler [request]
  20. (response "ClojureScript devmode"))
  21. (def src-files (atom {}))
  22. (defn new-or-deleted-files? [files1 files2]
  23. (let [s1 (into #{} files1)
  24. s2 (into #{} files2)]
  25. (not (= s1 s2))))
  26. (defn changes? [dir]
  27. (let [files (into {} (map (fn [file]
  28. [(.getAbsolutePath file)
  29. (.lastModified file)])
  30. (find-clojurescript-sources-in-dir
  31. (File. dir))))]
  32. (if (new-or-deleted-files? (keys files) (keys @src-files))
  33. (boolean (reset! src-files files))
  34. (if (some (fn [[path timestamp]]
  35. (not (= (get @src-files path) timestamp))) files)
  36. (boolean (reset! src-files files))
  37. false))))
  38. (defn wrap-compile [handler dir compile-fn]
  39. (fn [request]
  40. (when (changes? dir)
  41. (println "Compiling ClojureScript files ...")
  42. (compile-fn)
  43. (println "Done."))
  44. (handler request)))
  45. (defn app [dir compile-fn]
  46. (-> handler
  47. (wrap-file dir)
  48. (wrap-compile dir compile-fn)))
  49. (def server nil)
  50. (defn devmode [dir compile-fn]
  51. (run-jetty (app dir compile-fn) {:port 9090}))
  52. (defn start-devmode [dir compile-fn]
  53. (alter-var-root (var server)
  54. (fn [v]
  55. (run-jetty (app dir compile-fn) {:port 9090 :join? false}))))
  56. (defn stop-devmode []
  57. (when server
  58. (.stop (.get server))))
  59. (comment
  60. (cljsc/build "samples/hello/src" {:output-dir "samples/hello/out"
  61. :output-to "samples/hello/hello.js"}))