diff --git a/README.md b/README.md index 1f6f1f0..25a9337 100644 --- a/README.md +++ b/README.md @@ -3,12 +3,19 @@ [shadow-cljs](https://github.com/thheller/shadow-cljs) template. Supports Om, Reagent and Rum. +Build tools supported are lein, deps.edn and native shadow-cljs. + ## Usage +Give it a UI framework and a build tool. Defaults to native shadow-cljs and reagent. ``` shell lein new shadow-cljs your-project +reagent lein new shadow-cljs your-project +om lein new shadow-cljs your-project +rum +lein new shadow-cljs your-project +lein +om +lein new shadow-cljs your-project +depsedn +om +lein new shadow-cljs your-project +native +om +... ``` ## License diff --git a/resources/leiningen/new/shadow_cljs/deps/deps.edn b/resources/leiningen/new/shadow_cljs/deps/deps.edn new file mode 100644 index 0000000..bd5df96 --- /dev/null +++ b/resources/leiningen/new/shadow_cljs/deps/deps.edn @@ -0,0 +1,19 @@ +{:deps { + binaryage/devtools {:mvn/version "0.9.10"} + thheller/shadow-cljs {:mvn/version "2.5.1"} + {{#om}} + com.tiensonqin/om {:mvn/version "1.0.0-beta2-SNAPSHOT"} + {{/om}} + {{#rum}} + ua.modnakasta/rum {:mvn/version "0.11.0-2"} + org.roman01la/citrus {:mvn/version "3.0.0" :exclusions [rum]} + {{/rum}} + {{#reagent}} + reagent {:mvn/version "0.8.0-alpha2"} + {{/reagent}}} + + :source-paths + ["src"] + + :aliases {:outdated {:extra-deps {olical/depot {:mvn/version "1.2.0"}} + :main-opts ["-m" "depot.outdated.main"]}}} diff --git a/resources/leiningen/new/shadow_cljs/lein/project.clj b/resources/leiningen/new/shadow_cljs/lein/project.clj new file mode 100644 index 0000000..f98a99f --- /dev/null +++ b/resources/leiningen/new/shadow_cljs/lein/project.clj @@ -0,0 +1,21 @@ +(defproject + {{name}} "0.1.0-SNAPSHOT" + :description "FIXME: write description" + :url "http://example.com/FIXME" + :license {:name "Eclipse Public License" + :url "http://www.eclipse.org/legal/epl-v10.html"} + + :dependencies [[binaryage/devtools "0.9.10"] + [thheller/shadow-cljs "2.5.1"] + {{#om}} + [com.tiensonqin/om "1.0.0-beta2-SNAPSHOT"] + {{/om}} + {{#rum}} + [ua.modnakasta/rum "0.11.0-2"] + [org.roman01la/citrus "3.0.0" + :exclusions [rum]] + {{/rum}} + {{#reagent}} + [reagent "0.8.0-alpha2"] + {{/reagent}}] + :source-paths ["src"]) diff --git a/resources/leiningen/new/shadow_cljs/rum/shadow-cljs.edn b/resources/leiningen/new/shadow_cljs/native/shadow-cljs.edn similarity index 61% rename from resources/leiningen/new/shadow_cljs/rum/shadow-cljs.edn rename to resources/leiningen/new/shadow_cljs/native/shadow-cljs.edn index c07567d..b677693 100644 --- a/resources/leiningen/new/shadow_cljs/rum/shadow-cljs.edn +++ b/resources/leiningen/new/shadow_cljs/native/shadow-cljs.edn @@ -1,11 +1,26 @@ ;; shadow-cljs configuration -{:source-paths +{ + {{#native}} + :source-paths ["src"] - - :dependencies [[binaryage/devtools "0.9.7"] - ;; fork to support react 16 + :dependencies [[binaryage/devtools "0.9.10"] + {{#om}} + [com.tiensonqin/om "1.0.0-beta2-SNAPSHOT"] + {{/om}} + {{#rum}} [ua.modnakasta/rum "0.11.0-2"] - [org.roman01la/citrus "3.0.0" :exclusions [rum]]] + [org.roman01la/citrus "3.0.0" :exclusions [rum]] + {{/rum}} + {{#reagent}} + [reagent "0.8.0-alpha2"] + {{/reagent}}] + {{/native}} + {{#depsedn}} + :deps true + {{/depsedn}} + {{#lein}} + :lein true + {{/lein}} ;; set an nrepl port for connection to a REPL. :nrepl {:port 8777} @@ -27,5 +42,4 @@ ;; serve the public directory over http at port 8700 :http-root "public" :http-port 8700 - :preloads [devtools.preload]} - }}} + :preloads [devtools.preload]}}}} diff --git a/resources/leiningen/new/shadow_cljs/om/shadow-cljs.edn b/resources/leiningen/new/shadow_cljs/om/shadow-cljs.edn deleted file mode 100644 index 48e2d6f..0000000 --- a/resources/leiningen/new/shadow_cljs/om/shadow-cljs.edn +++ /dev/null @@ -1,30 +0,0 @@ -;; shadow-cljs configuration -{:source-paths - ["src"] - - :dependencies [[binaryage/devtools "0.9.7"] - ;; fork to support react 16 - [com.tiensonqin/om "1.0.0-beta2-SNAPSHOT"]] - - ;; set an nrepl port for connection to a REPL. - :nrepl {:port 8777} - - :builds - {:app {:target :browser - :output-dir "public/js/compiled" - :asset-path "/js/compiled" - - :modules - {:main - {:entries [{{name}}.core]}} - - :devtools - ;; before live-reloading any code call this function - {:before-load {{name}}.core/stop - ;; after live-reloading finishes call this function - :after-load {{name}}.core/start - ;; serve the public directory over http at port 8700 - :http-root "public" - :http-port 8700 - :preloads [devtools.preload]} - }}} diff --git a/resources/leiningen/new/shadow_cljs/reagent/shadow-cljs.edn b/resources/leiningen/new/shadow_cljs/reagent/shadow-cljs.edn deleted file mode 100644 index 071b000..0000000 --- a/resources/leiningen/new/shadow_cljs/reagent/shadow-cljs.edn +++ /dev/null @@ -1,29 +0,0 @@ -;; shadow-cljs configuration -{:source-paths - ["src"] - - :dependencies [[binaryage/devtools "0.9.7"] - [reagent "0.8.0-alpha2"]] - - ;; set an nrepl port for connection to a REPL. - :nrepl {:port 8777} - - :builds - {:app {:target :browser - :output-dir "public/js/compiled" - :asset-path "/js/compiled" - - :modules - {:main - {:entries [{{name}}.core]}} - - :devtools - ;; before live-reloading any code call this function - {:before-load {{name}}.core/stop - ;; after live-reloading finishes call this function - :after-load {{name}}.core/start - ;; serve the public directory over http at port 8700 - :http-root "public" - :http-port 8700 - :preloads [devtools.preload]} - }}} diff --git a/src/leiningen/new/shadow_cljs.clj b/src/leiningen/new/shadow_cljs.clj index 239fc12..94cc0bc 100644 --- a/src/leiningen/new/shadow_cljs.clj +++ b/src/leiningen/new/shadow_cljs.clj @@ -8,28 +8,51 @@ (defn templates-by-lib [lib data] (get - {:om [["src/{{sanitized}}/core.cljs" (render "om/core.cljs" data)] - ["shadow-cljs.edn" (render "om/shadow-cljs.edn" data)]] - :reagent [["src/{{sanitized}}/core.cljs" (render "reagent/core.cljs" data)] - ["shadow-cljs.edn" (render "reagent/shadow-cljs.edn" data)]] - :rum [["src/{{sanitized}}/core.cljs" (render "rum/core.cljs" data)] - ["shadow-cljs.edn" (render "rum/shadow-cljs.edn" data)]]} + {:om [["src/{{sanitized}}/core.cljs" (render "om/core.cljs" data)]] + :reagent [["src/{{sanitized}}/core.cljs" (render "reagent/core.cljs" data)]] + :rum [["src/{{sanitized}}/core.cljs" (render "rum/core.cljs" data)]]} lib)) +(defn templates-by-tool + [tool data] + (get + {:native [["shadow-cljs.edn" (render "native/shadow-cljs.edn" data)]] + :depsedn [["shadow-cljs.edn" (render "native/shadow-cljs.edn" data)] + ["deps.edn" (render "deps/deps.edn" data)]] + :lein [["shadow-cljs.edn" (render "native/shadow-cljs.edn" data)] + ["project.clj" (render "lein/project.clj" data)]]} + tool)) + +(def supported-libs + #{:om :reagent :rum}) + +(def supported-build-tools + #{:native :lein :depsedn}) + +(defn keywordize + [option] + (keyword (clojure.string/replace option "+" ""))) + (defn shadow-cljs - [name & lib] + [name & opts] (main/info "Generating fresh shadow-cljs project.") - (let [lib (if-let [lib (first lib)] - (let [v (keyword (clojure.string/replace lib "+" ""))] - v) - :reagent) + (let [opts (map keywordize opts) + lib (if-let [lib (first (remove supported-build-tools opts))] + lib + :reagent) + tool (if-let [tool (first (remove supported-libs opts))] + tool + :native) data {:name name - :sanitized (name-to-path name)}] + :sanitized (name-to-path name) + tool true + lib true}] + (main/info data) (->> [["package.json" (raw "package.json")] ["README.md" (raw "README.md")] ["public/index.html" (render "index.html" data)] - ["public/css/style.css" (raw "style.css")] - ] + ["public/css/style.css" (raw "style.css")]] (concat (templates-by-lib lib data)) + (concat (templates-by-tool tool data)) (apply ->files data))))