From d9f392aee49da9827cf33525c0f7ee848c49fef4 Mon Sep 17 00:00:00 2001 From: Ilshat Sultanov Date: Mon, 19 Sep 2022 23:55:05 +0500 Subject: [PATCH] feat(cli/templates) add clojurescript --- .changes/clojurescript.md | 6 ++++ .scripts/generate-templates-matrix.js | 1 + README.md | 1 + packages/cli/fragments/_assets_/cljs.svg | 28 +++++++++++++++++++ .../.vscode/extensions.json | 3 ++ .../fragment-clojurescript/README.md | 7 +++++ .../fragment-clojurescript/_cta_manifest_ | 13 +++++++++ .../fragment-clojurescript/_gitignore | 23 +++++++++++++++ .../fragments/fragment-clojurescript/deps.edn | 11 ++++++++ .../fragment-clojurescript/karma.config.js | 22 +++++++++++++++ .../fragment-clojurescript/package.json | 28 +++++++++++++++++++ .../fragment-clojurescript/public/index.html | 14 ++++++++++ .../fragment-clojurescript/shadow-cljs.edn | 23 +++++++++++++++ .../src/main/clojure/app/core.cljs | 25 +++++++++++++++++ .../src/test/clojure/app/core_test.cljs | 9 ++++++ packages/cli/src/package_manager.rs | 1 + packages/cli/src/template.rs | 4 +++ 17 files changed, 219 insertions(+) create mode 100644 .changes/clojurescript.md create mode 100644 packages/cli/fragments/_assets_/cljs.svg create mode 100644 packages/cli/fragments/fragment-clojurescript/.vscode/extensions.json create mode 100644 packages/cli/fragments/fragment-clojurescript/README.md create mode 100644 packages/cli/fragments/fragment-clojurescript/_cta_manifest_ create mode 100644 packages/cli/fragments/fragment-clojurescript/_gitignore create mode 100644 packages/cli/fragments/fragment-clojurescript/deps.edn create mode 100644 packages/cli/fragments/fragment-clojurescript/karma.config.js create mode 100644 packages/cli/fragments/fragment-clojurescript/package.json create mode 100644 packages/cli/fragments/fragment-clojurescript/public/index.html create mode 100644 packages/cli/fragments/fragment-clojurescript/shadow-cljs.edn create mode 100644 packages/cli/fragments/fragment-clojurescript/src/main/clojure/app/core.cljs create mode 100644 packages/cli/fragments/fragment-clojurescript/src/test/clojure/app/core_test.cljs diff --git a/.changes/clojurescript.md b/.changes/clojurescript.md new file mode 100644 index 0000000000..d92d47c858 --- /dev/null +++ b/.changes/clojurescript.md @@ -0,0 +1,6 @@ +--- +"create-tauri-app": patch +"create-tauri-app-js": patch +--- + +Add `clojurescript` template. diff --git a/.scripts/generate-templates-matrix.js b/.scripts/generate-templates-matrix.js index ccd7ba4fbd..2ac93091a1 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 023fc638eb..936457f7ac 100644 --- a/README.md +++ b/README.md @@ -85,6 +85,7 @@ Currently supported template presets include: - `next-ts` - `preact` - `preact-ts` +- `clojurescript` You can use `.` for the project name to scaffold in the current directory. diff --git a/packages/cli/fragments/_assets_/cljs.svg b/packages/cli/fragments/_assets_/cljs.svg new file mode 100644 index 0000000000..0d24013bcb --- /dev/null +++ b/packages/cli/fragments/_assets_/cljs.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + 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..24d7cc6de8 --- /dev/null +++ b/packages/cli/fragments/fragment-clojurescript/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["tauri-apps.tauri-vscode", "rust-lang.rust-analyzer"] +} diff --git a/packages/cli/fragments/fragment-clojurescript/README.md b/packages/cli/fragments/fragment-clojurescript/README.md new file mode 100644 index 0000000000..c270ac48cb --- /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) diff --git a/packages/cli/fragments/fragment-clojurescript/_cta_manifest_ b/packages/cli/fragments/fragment-clojurescript/_cta_manifest_ new file mode 100644 index 0000000000..78871efc26 --- /dev/null +++ b/packages/cli/fragments/fragment-clojurescript/_cta_manifest_ @@ -0,0 +1,13 @@ +# 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:3000 +distDir = ../dist +withGlobalTauri = true + +[files] +cljs.svg = public/cljs.svg +tauri.svg = public/tauri.svg 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/deps.edn b/packages/cli/fragments/fragment-clojurescript/deps.edn new file mode 100644 index 0000000000..335ca7d043 --- /dev/null +++ b/packages/cli/fragments/fragment-clojurescript/deps.edn @@ -0,0 +1,11 @@ +{:paths ["src/main/clojure"] + + :deps {reagent/reagent {:mvn/version "1.1.1" + :exclusions [cljsjs/react + cljsjs/react-dom + cljsjs/react-dom-server]}} + + :aliases {:develop {:extra-deps {thheller/shadow-cljs {:mvn/version "2.20.1"} + binaryage/devtools {:mvn/version "1.0.6"}}} + + :test {:extra-paths ["src/test/clojure"]}}} diff --git a/packages/cli/fragments/fragment-clojurescript/karma.config.js b/packages/cli/fragments/fragment-clojurescript/karma.config.js new file mode 100644 index 0000000000..c37916d173 --- /dev/null +++ b/packages/cli/fragments/fragment-clojurescript/karma.config.js @@ -0,0 +1,22 @@ +module.exports = function (config) { + config.set({ + singleRun: true, + browsers: ["ChromeHeadlessNoSandbox"], + customLaunchers: { + ChromeHeadlessNoSandbox: { + base: "ChromeHeadless", + flags: ["--no-sandbox"], + }, + }, + basePath: "target", + files: ["test/js/ci.js"], + frameworks: ["cljs-test"], + plugins: ["karma-cljs-test", "karma-chrome-launcher"], + colors: true, + logLevel: config.LOG_INFO, + client: { + args: ["shadow.test.karma.init"], + singleRun: true, + }, + }); +}; diff --git a/packages/cli/fragments/fragment-clojurescript/package.json b/packages/cli/fragments/fragment-clojurescript/package.json new file mode 100644 index 0000000000..f2e8876f6a --- /dev/null +++ b/packages/cli/fragments/fragment-clojurescript/package.json @@ -0,0 +1,28 @@ +{ + "name": "{{package_name}}", + "private": true, + "version": "0.0.0", + "scripts": { + "shadow:watch": "npx shadow-cljs watch app test", + "shadow:build": "npx shadow-cljs release app", + "test:build": "npx shadow-cljs compile ci", + "test:run": "npx karma start karma.config.js --single-run", + "clean": "rm -rf ./public/js ./target", + "dev": "npm run clean && npm run shadow:watch", + "test": "npm run clean && npm run test:build && npm run test:run", + "build": "npm run clean && npm run shadow:build", + "tauri": "tauri" + }, + "devDependencies": { + "@tauri-apps/cli": "^1.0.5", + "karma": "^6.4.0", + "karma-chrome-launcher": "^3.1.1", + "karma-cljs-test": "^0.1.0", + "shadow-cljs": "^2.20.1" + }, + "dependencies": { + "@tauri-apps/api": "^1.0.5", + "react": "^17.0.2", + "react-dom": "^17.0.2" + } +} 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..89c9738ae2 --- /dev/null +++ b/packages/cli/fragments/fragment-clojurescript/public/index.html @@ -0,0 +1,14 @@ + + + + + + + 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..38c2396b25 --- /dev/null +++ b/packages/cli/fragments/fragment-clojurescript/shadow-cljs.edn @@ -0,0 +1,23 @@ +{:deps {:aliases [:develop :test]} + + :nrepl {:init-ns user} + + :dev-http {3000 "public" + 3001 "target/test"} + + :build-defaults {:closure-defines {goog.DEBUG true} + :compiler-options {:output-feature-set :es-next}} + + :builds {:app {:target :browser + :output-dir "public/js" + :asset-path "/js" + :modules {:main {:init-fn app.core/-main}} + :devtools {:preloads [devtools.preload]} + :dev {:external-config {:devtools/config {:features-to-install [:formatters :hints]}}}} + + :test {:target :browser-test + :test-dir "target/test" + :devtools {}} + + :ci {:target :karma + :output-to "target/test/js/ci.js"}}} 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..51b65b02e9 --- /dev/null +++ b/packages/cli/fragments/fragment-clojurescript/src/main/clojure/app/core.cljs @@ -0,0 +1,25 @@ +(ns app.core + (:require + [goog.dom :as gdom] + [reagent.dom :as dom])) + + +(defn square + [x] + (* x x)) + + +(defn mount-root + "Mount root component." + {:dev/after-load true} + [] + (some->> + (gdom/getElement "root") + (dom/render [:h1 "Welcome to Tauri!"]))) + + +(defn -main + "Application entry point." + {:export true} + [& _args] + (mount-root)) diff --git a/packages/cli/fragments/fragment-clojurescript/src/test/clojure/app/core_test.cljs b/packages/cli/fragments/fragment-clojurescript/src/test/clojure/app/core_test.cljs new file mode 100644 index 0000000000..c2d0eb3023 --- /dev/null +++ b/packages/cli/fragments/fragment-clojurescript/src/test/clojure/app/core_test.cljs @@ -0,0 +1,9 @@ +(ns app.core-test + (:require + [app.core :as sut] + [cljs.test :as t :include-macros true])) + + +(t/deftest square-test + (t/testing "dummy test" + (t/is (= 4 (sut/square 2))))) diff --git a/packages/cli/src/package_manager.rs b/packages/cli/src/package_manager.rs index 031e06c080..965c24492b 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 5b4c1b0f85..8f9b1bf1be 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 { @@ -241,6 +243,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 +268,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()), } }