diff --git a/.changes/clojurescript.md b/.changes/clojurescript.md
new file mode 100644
index 0000000000..7bb3cdd265
--- /dev/null
+++ b/.changes/clojurescript.md
@@ -0,0 +1,6 @@
+---
+"create-tauri-app": minor
+"create-tauri-app-js": minor
+---
+
+Add `clojurescript` template.
diff --git a/.scripts/generate-templates-matrix.js b/.scripts/generate-templates-matrix.js
index ccd7ba4fbd..baf2f14efc 100644
--- a/.scripts/generate-templates-matrix.js
+++ b/.scripts/generate-templates-matrix.js
@@ -16,6 +16,7 @@ const nodeJsTemplates = [
"next-ts",
"preact",
"preact-ts",
+ "clojurescript",
];
const matrixConfig = [
diff --git a/README.md b/README.md
index c76e411243..b6338ada1e 100644
--- a/README.md
+++ b/README.md
@@ -87,6 +87,7 @@ Currently supported template presets include:
- `preact`
- `preact-ts`
- `angular`
+- `clojurescript`
You can use `.` for the project name to scaffold in the current directory.
diff --git a/packages/cli/fragments/base/src/style.css b/packages/cli/fragments/_assets_/style.css
similarity index 100%
rename from packages/cli/fragments/base/src/style.css
rename to packages/cli/fragments/_assets_/style.css
diff --git a/packages/cli/fragments/fragment-angular/_cta_manifest_ b/packages/cli/fragments/fragment-angular/_cta_manifest_
index 46bf06c6e9..7d20f39b02 100644
--- a/packages/cli/fragments/fragment-angular/_cta_manifest_
+++ b/packages/cli/fragments/fragment-angular/_cta_manifest_
@@ -8,4 +8,5 @@ devPath = http://localhost:1420
distDir = ../dist
[files]
-tauri.svg = src/assets/tauri.svg
\ No newline at end of file
+tauri.svg = src/assets/tauri.svg
+style.css = src/style.css
diff --git a/packages/cli/fragments/fragment-clojurescript/.vscode/extensions.json b/packages/cli/fragments/fragment-clojurescript/.vscode/extensions.json
new file mode 100644
index 0000000000..f81944f560
--- /dev/null
+++ b/packages/cli/fragments/fragment-clojurescript/.vscode/extensions.json
@@ -0,0 +1,7 @@
+{
+ "recommendations": [
+ "tauri-apps.tauri-vscode",
+ "rust-lang.rust-analyzer",
+ "betterthantomorrow.calva"
+ ]
+}
diff --git a/packages/cli/fragments/fragment-clojurescript/README.md b/packages/cli/fragments/fragment-clojurescript/README.md
new file mode 100644
index 0000000000..2a3f2a45a9
--- /dev/null
+++ b/packages/cli/fragments/fragment-clojurescript/README.md
@@ -0,0 +1,7 @@
+# Tauri + ClojureScript
+
+This template should help get you started developing with Tauri and ClojureScript + shadow-cljs.
+
+## Recommended IDE Setup
+
+- [VS Code](https://code.visualstudio.com/) + [Tauri](https://marketplace.visualstudio.com/items?itemName=tauri-apps.tauri-vscode) + [rust-analyzer](https://marketplace.visualstudio.com/items?itemName=rust-lang.rust-analyzer) + [calva](https://marketplace.visualstudio.com/items?itemName=betterthantomorrow.calva)
diff --git a/packages/cli/fragments/fragment-clojurescript/_[pnpm]_.npmrc b/packages/cli/fragments/fragment-clojurescript/_[pnpm]_.npmrc
new file mode 100644
index 0000000000..4c49f29fc5
--- /dev/null
+++ b/packages/cli/fragments/fragment-clojurescript/_[pnpm]_.npmrc
@@ -0,0 +1,7 @@
+# You can remove these settings if you use `yarn` or `npm`.
+# These settings allow us to use `pnpm` as a package manager.
+# Without these settings, we will receive several errors from the compiler:
+# `object-assign`, `scheduler`, `scheduler/tracing` is not available.
+
+public-hoist-pattern[]='object-assign'
+public-hoist-pattern[]='scheduler'
diff --git a/packages/cli/fragments/fragment-clojurescript/_cta_manifest_ b/packages/cli/fragments/fragment-clojurescript/_cta_manifest_
new file mode 100644
index 0000000000..18f8bcd1ac
--- /dev/null
+++ b/packages/cli/fragments/fragment-clojurescript/_cta_manifest_
@@ -0,0 +1,12 @@
+# Copyright 2019-2022 Tauri Programme within The Commons Conservancy
+# SPDX-License-Identifier: Apache-2.0
+# SPDX-License-Identifier: MIT
+
+beforeDevCommand = {{pkg_manager_run_command}} dev
+beforeBuildCommand = {{pkg_manager_run_command}} build
+devPath = http://localhost:1420
+distDir = ../public
+
+[files]
+tauri.svg = public/tauri.svg
+style.css = public/style.css
diff --git a/packages/cli/fragments/fragment-clojurescript/_gitignore b/packages/cli/fragments/fragment-clojurescript/_gitignore
new file mode 100644
index 0000000000..8fb285a39e
--- /dev/null
+++ b/packages/cli/fragments/fragment-clojurescript/_gitignore
@@ -0,0 +1,23 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+lerna-debug.log*
+
+node_modules
+dist
+dist-ssr
+*.local
+
+# Editor directories and files
+.vscode/*
+!.vscode/extensions.json
+.idea
+.DS_Store
+.cpcache
+.clj-kondo/.cache
+.shadow-cljs
+target
diff --git a/packages/cli/fragments/fragment-clojurescript/package.json b/packages/cli/fragments/fragment-clojurescript/package.json
new file mode 100644
index 0000000000..0a4ba4b074
--- /dev/null
+++ b/packages/cli/fragments/fragment-clojurescript/package.json
@@ -0,0 +1,20 @@
+{
+ "name": "{{package_name}}",
+ "private": true,
+ "version": "0.0.0",
+ "scripts": {
+ "dev": "shadow-cljs watch app",
+ "build": "shadow-cljs release app",
+ "shadow-cljs": "shadow-cljs",
+ "tauri": "tauri"
+ },
+ "devDependencies": {
+ "@tauri-apps/cli": "^1.1.1",
+ "shadow-cljs": "^2.20.2"
+ },
+ "dependencies": {
+ "@tauri-apps/api": "^1.1.0",
+ "react": "^17.0.2",
+ "react-dom": "^17.0.2"
+ }
+}
diff --git a/packages/cli/fragments/fragment-clojurescript/public/cljs.svg b/packages/cli/fragments/fragment-clojurescript/public/cljs.svg
new file mode 100644
index 0000000000..0d24013bcb
--- /dev/null
+++ b/packages/cli/fragments/fragment-clojurescript/public/cljs.svg
@@ -0,0 +1,28 @@
+
+
+
diff --git a/packages/cli/fragments/fragment-clojurescript/public/index.html b/packages/cli/fragments/fragment-clojurescript/public/index.html
new file mode 100644
index 0000000000..c6c7005f4e
--- /dev/null
+++ b/packages/cli/fragments/fragment-clojurescript/public/index.html
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+ Tauri + ClojureScript
+
+
+
+
+
+
+
diff --git a/packages/cli/fragments/fragment-clojurescript/shadow-cljs.edn b/packages/cli/fragments/fragment-clojurescript/shadow-cljs.edn
new file mode 100644
index 0000000000..3edc829081
--- /dev/null
+++ b/packages/cli/fragments/fragment-clojurescript/shadow-cljs.edn
@@ -0,0 +1,10 @@
+{:source-paths ["src/main/clojure"]
+
+ :dependencies [[reagent/reagent "1.1.1"]]
+
+ :dev-http {1420 "public"}
+
+ :builds {:app {:target :browser
+ :output-dir "public/js"
+ :asset-path "/js"
+ :modules {:main {:init-fn app.core/main}}}}}
diff --git a/packages/cli/fragments/fragment-clojurescript/src/main/clojure/app/core.cljs b/packages/cli/fragments/fragment-clojurescript/src/main/clojure/app/core.cljs
new file mode 100644
index 0000000000..edf3564965
--- /dev/null
+++ b/packages/cli/fragments/fragment-clojurescript/src/main/clojure/app/core.cljs
@@ -0,0 +1,53 @@
+(ns app.core
+ (:require
+ ["@tauri-apps/api/tauri" :as tauri]
+ [goog.dom :as gdom]
+ [reagent.core :as r]
+ [reagent.dom :as dom]))
+
+(def root
+ (let [*name (r/atom "")
+ *message (r/atom "")
+ handle-input (fn [new-value]
+ (reset! *name new-value))
+ greet! (fn [name]
+ ;; Learn more about Tauri commands at https://tauri.app/v1/guides/features/command
+ (-> (.invoke tauri "greet" #js {:name name})
+ (.then (fn [res]
+ (reset! *message res)))))]
+ (fn []
+ [:div.container
+ [:h1 "Welcome to Tauri!"]
+
+ [:div.row
+ [:a {:href "https://tauri.app" :target "_blank"}
+ [:img {:src "/tauri.svg" :class "logo tauri" :alt "Tauri logo"}]]
+ [:a {:href "https://clojurescript.org" :target "_blank"}
+ [:img {:src "/cljs.svg" :class "logo tauri" :alt "ClojureScript logo"}]]]
+
+ [:p "Click on the Tauri, ClojureScript logos to learn more."]
+
+ [:div.row
+ [:input {:type "text"
+ :id "greet-input"
+ :on-change #(handle-input (.. % -target -value))
+ :placeholder "Enter a name..."}]
+ [:button {:type "button" :on-click #(greet! @*name)} "Greet"]]
+
+ [:p @*message]])))
+
+
+(defn mount-root
+ "Mount root component."
+ {:dev/after-load true}
+ []
+ (some->>
+ (gdom/getElement "root")
+ (dom/render [root])))
+
+
+(defn main
+ "Application entry point."
+ {:export true}
+ [& _args]
+ (mount-root))
diff --git a/packages/cli/fragments/fragment-next-ts/_cta_manifest_ b/packages/cli/fragments/fragment-next-ts/_cta_manifest_
index fb478a4ea6..08b2f53d50 100644
--- a/packages/cli/fragments/fragment-next-ts/_cta_manifest_
+++ b/packages/cli/fragments/fragment-next-ts/_cta_manifest_
@@ -10,4 +10,5 @@ distDir = ../dist
[files]
next.svg = src/assets/next.svg
react.svg = src/assets/react.svg
-tauri.svg = src/assets/tauri.svg
\ No newline at end of file
+tauri.svg = src/assets/tauri.svg
+style.css = src/style.css
diff --git a/packages/cli/fragments/fragment-next/_cta_manifest_ b/packages/cli/fragments/fragment-next/_cta_manifest_
index fb478a4ea6..08b2f53d50 100644
--- a/packages/cli/fragments/fragment-next/_cta_manifest_
+++ b/packages/cli/fragments/fragment-next/_cta_manifest_
@@ -10,4 +10,5 @@ distDir = ../dist
[files]
next.svg = src/assets/next.svg
react.svg = src/assets/react.svg
-tauri.svg = src/assets/tauri.svg
\ No newline at end of file
+tauri.svg = src/assets/tauri.svg
+style.css = src/style.css
diff --git a/packages/cli/fragments/fragment-preact-ts/_cta_manifest_ b/packages/cli/fragments/fragment-preact-ts/_cta_manifest_
index f9c72050bc..092bb769e3 100644
--- a/packages/cli/fragments/fragment-preact-ts/_cta_manifest_
+++ b/packages/cli/fragments/fragment-preact-ts/_cta_manifest_
@@ -10,4 +10,5 @@ distDir = ../dist
[files]
preact.svg = src/assets/preact.svg
vite.svg = public/vite.svg
-tauri.svg = public/tauri.svg
\ No newline at end of file
+tauri.svg = public/tauri.svg
+style.css = src/style.css
diff --git a/packages/cli/fragments/fragment-preact/_cta_manifest_ b/packages/cli/fragments/fragment-preact/_cta_manifest_
index f9c72050bc..092bb769e3 100644
--- a/packages/cli/fragments/fragment-preact/_cta_manifest_
+++ b/packages/cli/fragments/fragment-preact/_cta_manifest_
@@ -10,4 +10,5 @@ distDir = ../dist
[files]
preact.svg = src/assets/preact.svg
vite.svg = public/vite.svg
-tauri.svg = public/tauri.svg
\ No newline at end of file
+tauri.svg = public/tauri.svg
+style.css = src/style.css
diff --git a/packages/cli/fragments/fragment-react-ts/_cta_manifest_ b/packages/cli/fragments/fragment-react-ts/_cta_manifest_
index 9a632efa5d..a8e45f6dc1 100644
--- a/packages/cli/fragments/fragment-react-ts/_cta_manifest_
+++ b/packages/cli/fragments/fragment-react-ts/_cta_manifest_
@@ -10,4 +10,5 @@ distDir = ../dist
[files]
react.svg = src/assets/react.svg
vite.svg = public/vite.svg
-tauri.svg = public/tauri.svg
\ No newline at end of file
+tauri.svg = public/tauri.svg
+style.css = src/style.css
diff --git a/packages/cli/fragments/fragment-react/_cta_manifest_ b/packages/cli/fragments/fragment-react/_cta_manifest_
index 9a632efa5d..a8e45f6dc1 100644
--- a/packages/cli/fragments/fragment-react/_cta_manifest_
+++ b/packages/cli/fragments/fragment-react/_cta_manifest_
@@ -10,4 +10,5 @@ distDir = ../dist
[files]
react.svg = src/assets/react.svg
vite.svg = public/vite.svg
-tauri.svg = public/tauri.svg
\ No newline at end of file
+tauri.svg = public/tauri.svg
+style.css = src/style.css
diff --git a/packages/cli/fragments/fragment-solid-ts/_cta_manifest_ b/packages/cli/fragments/fragment-solid-ts/_cta_manifest_
index 4576bf9fd2..21cf06593c 100644
--- a/packages/cli/fragments/fragment-solid-ts/_cta_manifest_
+++ b/packages/cli/fragments/fragment-solid-ts/_cta_manifest_
@@ -10,4 +10,5 @@ distDir = ../dist
[files]
vite.svg = public/vite.svg
tauri.svg = public/tauri.svg
-solid.svg = src/assets/logo.svg
\ No newline at end of file
+solid.svg = src/assets/logo.svg
+style.css = src/style.css
diff --git a/packages/cli/fragments/fragment-solid/_cta_manifest_ b/packages/cli/fragments/fragment-solid/_cta_manifest_
index 4576bf9fd2..21cf06593c 100644
--- a/packages/cli/fragments/fragment-solid/_cta_manifest_
+++ b/packages/cli/fragments/fragment-solid/_cta_manifest_
@@ -10,4 +10,5 @@ distDir = ../dist
[files]
vite.svg = public/vite.svg
tauri.svg = public/tauri.svg
-solid.svg = src/assets/logo.svg
\ No newline at end of file
+solid.svg = src/assets/logo.svg
+style.css = src/style.css
diff --git a/packages/cli/fragments/fragment-svelte-ts/_cta_manifest_ b/packages/cli/fragments/fragment-svelte-ts/_cta_manifest_
index fa45db14f2..ce28e42094 100644
--- a/packages/cli/fragments/fragment-svelte-ts/_cta_manifest_
+++ b/packages/cli/fragments/fragment-svelte-ts/_cta_manifest_
@@ -10,4 +10,5 @@ distDir = ../dist
[files]
vite.svg = public/vite.svg
tauri.svg = public/tauri.svg
-svelte.svg = public/svelte.svg
\ No newline at end of file
+svelte.svg = public/svelte.svg
+style.css = src/style.css
diff --git a/packages/cli/fragments/fragment-svelte/_cta_manifest_ b/packages/cli/fragments/fragment-svelte/_cta_manifest_
index fa45db14f2..ce28e42094 100644
--- a/packages/cli/fragments/fragment-svelte/_cta_manifest_
+++ b/packages/cli/fragments/fragment-svelte/_cta_manifest_
@@ -10,4 +10,5 @@ distDir = ../dist
[files]
vite.svg = public/vite.svg
tauri.svg = public/tauri.svg
-svelte.svg = public/svelte.svg
\ No newline at end of file
+svelte.svg = public/svelte.svg
+style.css = src/style.css
diff --git a/packages/cli/fragments/fragment-vanilla-ts/_cta_manifest_ b/packages/cli/fragments/fragment-vanilla-ts/_cta_manifest_
index 4d9e628ca9..2cbd14eec3 100644
--- a/packages/cli/fragments/fragment-vanilla-ts/_cta_manifest_
+++ b/packages/cli/fragments/fragment-vanilla-ts/_cta_manifest_
@@ -7,3 +7,4 @@ withGlobalTauri = true
[files]
tauri.svg = src/assets/tauri.svg
vite.svg = src/assets/vite.svg
+style.css = src/style.css
diff --git a/packages/cli/fragments/fragment-vanilla/_cta_manifest_ b/packages/cli/fragments/fragment-vanilla/_cta_manifest_
index dd3c9cc245..dc45ad2143 100644
--- a/packages/cli/fragments/fragment-vanilla/_cta_manifest_
+++ b/packages/cli/fragments/fragment-vanilla/_cta_manifest_
@@ -3,4 +3,5 @@ distDir = ../src
withGlobalTauri = true
[files]
-tauri.svg = src/assets/tauri.svg
\ No newline at end of file
+tauri.svg = src/assets/tauri.svg
+style.css = src/style.css
diff --git a/packages/cli/fragments/fragment-vue-ts/_cta_manifest_ b/packages/cli/fragments/fragment-vue-ts/_cta_manifest_
index 8e17b372e5..27f07b2274 100644
--- a/packages/cli/fragments/fragment-vue-ts/_cta_manifest_
+++ b/packages/cli/fragments/fragment-vue-ts/_cta_manifest_
@@ -10,4 +10,5 @@ distDir = ../dist
[files]
vite.svg = public/vite.svg
tauri.svg = public/tauri.svg
-vue.svg = src/assets/vue.svg
\ No newline at end of file
+vue.svg = src/assets/vue.svg
+style.css = src/style.css
diff --git a/packages/cli/fragments/fragment-vue/_cta_manifest_ b/packages/cli/fragments/fragment-vue/_cta_manifest_
index 8e17b372e5..27f07b2274 100644
--- a/packages/cli/fragments/fragment-vue/_cta_manifest_
+++ b/packages/cli/fragments/fragment-vue/_cta_manifest_
@@ -10,4 +10,5 @@ distDir = ../dist
[files]
vite.svg = public/vite.svg
tauri.svg = public/tauri.svg
-vue.svg = src/assets/vue.svg
\ No newline at end of file
+vue.svg = src/assets/vue.svg
+style.css = src/style.css
diff --git a/packages/cli/fragments/fragment-yew/_cta_manifest_ b/packages/cli/fragments/fragment-yew/_cta_manifest_
index e632ad4d40..1d72835934 100644
--- a/packages/cli/fragments/fragment-yew/_cta_manifest_
+++ b/packages/cli/fragments/fragment-yew/_cta_manifest_
@@ -9,4 +9,5 @@ distDir = ../dist
withGlobalTauri = true
[files]
-tauri.svg = public/tauri.svg
\ No newline at end of file
+tauri.svg = public/tauri.svg
+style.css = src/style.css
diff --git a/packages/cli/node/README.md b/packages/cli/node/README.md
index cae27eb583..a4563d17d7 100644
--- a/packages/cli/node/README.md
+++ b/packages/cli/node/README.md
@@ -59,6 +59,7 @@ Currently supported template presets include:
- `preact`
- `preact-ts`
- `angular`
+- `clojurescript`
You can use `.` for the project name to scaffold in the current directory.
diff --git a/packages/cli/src/package_manager.rs b/packages/cli/src/package_manager.rs
index 031e06c080..71ce26471d 100644
--- a/packages/cli/src/package_manager.rs
+++ b/packages/cli/src/package_manager.rs
@@ -49,6 +49,7 @@ impl PackageManager {
Template::NextTs,
Template::Preact,
Template::PreactTs,
+ Template::ClojureScript,
],
}
}
diff --git a/packages/cli/src/template.rs b/packages/cli/src/template.rs
index 98b9151d23..c492a4fc60 100644
--- a/packages/cli/src/template.rs
+++ b/packages/cli/src/template.rs
@@ -32,6 +32,7 @@ pub enum Template {
NextTs,
Preact,
PreactTs,
+ ClojureScript,
}
impl Default for Template {
@@ -58,6 +59,7 @@ impl<'a> Template {
Template::Preact,
Template::PreactTs,
Template::VanillaTs,
+ Template::ClojureScript,
];
pub fn post_init_info(&self, pkg_manager: PackageManager) -> Option {
@@ -85,6 +87,18 @@ impl<'a> Template {
BLUE = BLUE,
),
),
+ Template::ClojureScript => Some(
+ format!(
+ "{ITALIC}{DIM}You also need to install{DIMRESET} {YELLOW}java{WHITE} {DIM}(e.g. {DIMRESET}{BLUE}https://adoptium.net{WHITE}{DIM}) and{DIMRESET} {YELLOW}clojure{WHITE} {DIM}({DIMRESET}{BLUE}https://clojure.org/guides/install_clojure{WHITE}{DIM}){DIMRESET}{RESET}",
+ ITALIC = ITALIC,
+ DIM = DIM,
+ DIMRESET = DIMRESET,
+ YELLOW = YELLOW,
+ WHITE = WHITE,
+ BLUE = BLUE,
+ RESET = RESET
+ ),
+ ),
_ => None,
}
}
@@ -241,6 +255,7 @@ impl Display for Template {
Template::NextTs => write!(f, "next-ts"),
Template::Preact => write!(f, "preact"),
Template::PreactTs => write!(f, "preact-ts"),
+ Template::ClojureScript => write!(f, "clojurescript"),
}
}
}
@@ -265,6 +280,7 @@ impl FromStr for Template {
"preact" => Ok(Template::Preact),
"preact-ts" => Ok(Template::PreactTs),
"vanilla-ts" => Ok(Template::VanillaTs),
+ "clojurescript" => Ok(Template::ClojureScript),
_ => Err("Invalid template".to_string()),
}
}