From 15430932abb8291a929837dea06193defbe03f9e Mon Sep 17 00:00:00 2001 From: narocath Date: Tue, 30 Mar 2021 14:48:57 +0300 Subject: [PATCH 1/7] "added tailwind-nubank workspaces-ability to use options" --- .lsp/sqlite.db | Bin 0 -> 356352 bytes resources/leiningen/new/xiana/gitignore | 1 + resources/leiningen/new/xiana/package.json | 29 ++++++ .../leiningen/new/xiana/postcss.config.js | 24 +++++ resources/leiningen/new/xiana/project.clj | 51 ++++------ .../xiana/resources/public/workspaces.html | 14 +++ resources/leiningen/new/xiana/shadow-cljs.edn | 15 +++ .../src/backend/app/controllers/re_frame.clj | 9 ++ .../new/xiana/src/backend/app_name.clj | 14 +++ .../src/frontend/app_name/workspaces.cljs | 18 ++++ .../leiningen/new/xiana/src/frontend/base.css | 3 + .../new/xiana/src/frontend/hooks.clj | 44 +++++++++ .../leiningen/new/xiana/tailwind.config.js | 13 +++ src/leiningen/new/base.clj | 46 +++++++++ src/leiningen/new/helpers.clj | 23 +++++ src/leiningen/new/nubank.clj | 9 ++ src/leiningen/new/xiana.clj | 88 +++++++++--------- 17 files changed, 328 insertions(+), 73 deletions(-) create mode 100644 .lsp/sqlite.db create mode 100644 resources/leiningen/new/xiana/package.json create mode 100644 resources/leiningen/new/xiana/postcss.config.js create mode 100644 resources/leiningen/new/xiana/resources/public/workspaces.html create mode 100644 resources/leiningen/new/xiana/shadow-cljs.edn create mode 100644 resources/leiningen/new/xiana/src/frontend/app_name/workspaces.cljs create mode 100644 resources/leiningen/new/xiana/src/frontend/base.css create mode 100644 resources/leiningen/new/xiana/src/frontend/hooks.clj create mode 100644 resources/leiningen/new/xiana/tailwind.config.js create mode 100644 src/leiningen/new/base.clj create mode 100644 src/leiningen/new/helpers.clj create mode 100644 src/leiningen/new/nubank.clj diff --git a/.lsp/sqlite.db b/.lsp/sqlite.db new file mode 100644 index 0000000000000000000000000000000000000000..97bbd3d92bbe611bbd23aa334dbcc084aad97846 GIT binary patch literal 356352 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 + + + + diff --git a/resources/leiningen/new/xiana/shadow-cljs.edn b/resources/leiningen/new/xiana/shadow-cljs.edn new file mode 100644 index 0000000..ae5c414 --- /dev/null +++ b/resources/leiningen/new/xiana/shadow-cljs.edn @@ -0,0 +1,15 @@ +{:lein true + :nrepl {:port 8777} + :builds {:app {:target :browser + :build-hooks [(hooks/purge-css) + (hooks/npm-init)] + :output-dir "resources/public/js/app" + :asset-path "/js/app" + :modules {:main {:init-fn {{sanitized-name}}.core/init + :preloads [devtools.preload]}}} + {{#nubank?}}:workspaces {:target :browser + :output-dir "resources/public/js/workspaces" + :asset-path "/js/workspaces" + :modules {:main {:entries [{{sanitized-name}}.workspaces] + :preloads [devtools.preload]}}}{{/nubank?}} + }} diff --git a/resources/leiningen/new/xiana/src/backend/app/controllers/re_frame.clj b/resources/leiningen/new/xiana/src/backend/app/controllers/re_frame.clj index fcbe601..26d4381 100644 --- a/resources/leiningen/new/xiana/src/backend/app/controllers/re_frame.clj +++ b/resources/leiningen/new/xiana/src/backend/app/controllers/re_frame.clj @@ -1,6 +1,15 @@ (ns controllers.re-frame (:require [xiana.core :as xiana] [ring.util.response :as ring])) +{{#nubank?}} +(defn handle-workspaces + [state] + (xiana/ok + (assoc state + :response + (-> "workspaces.html" + (ring/resource-response {:root "public"}) + (ring/header "Content-Type" "text/html; charset=utf-8"))))){{/nubank?}} (defn handle-index [state] diff --git a/resources/leiningen/new/xiana/src/backend/app_name.clj b/resources/leiningen/new/xiana/src/backend/app_name.clj index 969160f..9997d71 100644 --- a/resources/leiningen/new/xiana/src/backend/app_name.clj +++ b/resources/leiningen/new/xiana/src/backend/app_name.clj @@ -14,6 +14,7 @@ (def routes [["/" {:controller index/handle-index}] ["/re-frame" {:controller re-frame/handle-index}] + {{#nubank?}}["/workspaces" {:controller re-frame/handle-workspaces}]{{/nubank?}} ["/assets/*" (ring/create-resource-handler)]]) (defn system @@ -39,3 +40,16 @@ [& _args] (let [config (config/edn)] (component/start (system config)))) + +(def st + (-> (config/edn) + system + atom)) + +(defn- start-dev-system + [] + (swap! st component/start)) + +(defn- stop-dev-system + [] + (swap! st component/stop)) diff --git a/resources/leiningen/new/xiana/src/frontend/app_name/workspaces.cljs b/resources/leiningen/new/xiana/src/frontend/app_name/workspaces.cljs new file mode 100644 index 0000000..8f9edc7 --- /dev/null +++ b/resources/leiningen/new/xiana/src/frontend/app_name/workspaces.cljs @@ -0,0 +1,18 @@ +(ns {{sanitized-name}}.workspaces + (:require + [{{sanitized-name}}.events :as events] + [{{sanitized-name}}.views :as views] + [nubank.workspaces.card-types.react :refer [react-card]] + [nubank.workspaces.core :as ws] + [nubank.workspaces.model :as wsm] + [re-frame.core :as re-frame] + [reagent.core :as r])) + +(defonce init (ws/mount)) + +(re-frame/clear-subscription-cache!) + +(ws/defcard init-card + (re-frame/dispatch-sync [::events/initialize-db]) + (react-card + (r/as-element [views/main-panel]))) diff --git a/resources/leiningen/new/xiana/src/frontend/base.css b/resources/leiningen/new/xiana/src/frontend/base.css new file mode 100644 index 0000000..b5c61c9 --- /dev/null +++ b/resources/leiningen/new/xiana/src/frontend/base.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/resources/leiningen/new/xiana/src/frontend/hooks.clj b/resources/leiningen/new/xiana/src/frontend/hooks.clj new file mode 100644 index 0000000..0a2ef99 --- /dev/null +++ b/resources/leiningen/new/xiana/src/frontend/hooks.clj @@ -0,0 +1,44 @@ +(ns hooks + (:require + [clojure.java.io :as io] + [clojure.java.shell :refer [sh]] + [clojure.string :as s])) + +(defn exec + [& cmd] + (let [cmd (s/split (s/join " " (flatten cmd)) #"\s+") + _ (println (s/join " " cmd)) + {:keys [exit out err]} (apply sh cmd)] + (if (zero? exit) + (when-not (s/blank? out) + (println out)) + (println err)))) + + +(defn npm-init + {:shadow.build/stage :configure} + [build-state] + (if-not (and (.isDirectory (io/file "node_modules")) + (not (= 0 (count (.list (io/file "node_modules")))))) + (do (println ";;=>> 'Installing node_modules...") + (exec "npm install") + build-state) + (do (println ";;=>> 'npm is already initialized in the current project'") + build-state))) + +(defn purge-css + {:shadow.build/stage :flush} + [build-state] + (case (:shadow.build/mode build-state) + :release + (do + (println ";;=> 'Running prebuild script with -env production'") + (exec "npm run-script prebuild") + build-state) + :dev + (if (not (.exists (io/file "resources/public/main.css"))) + (do + (println ";;=> 'Runnnig preserve script'") + (exec "npm run-script preserve") + build-state) + build-state))) diff --git a/resources/leiningen/new/xiana/tailwind.config.js b/resources/leiningen/new/xiana/tailwind.config.js new file mode 100644 index 0000000..40ac096 --- /dev/null +++ b/resources/leiningen/new/xiana/tailwind.config.js @@ -0,0 +1,13 @@ +const colors = require('tailwindcss/colors') + +module.exports ={ + darkMode: 'class', + theme: {}, + variants: {}, + plugins: [], + purge: {enabled: false}, + future: { + removeDeprecatedGapUtilities: true, + prugeLayersByDefault: true, + }, +}; diff --git a/src/leiningen/new/base.clj b/src/leiningen/new/base.clj new file mode 100644 index 0000000..3239a8e --- /dev/null +++ b/src/leiningen/new/base.clj @@ -0,0 +1,46 @@ +(ns leiningen.new.base + (:require [leiningen.new.helpers :as helpers])) + +(def file-paths + ["Docker/db.Dockerfile" + "Docker/init.sql" + "src/backend/app/controllers/index.clj" + "src/backend/app/controllers/re_frame.clj" + "src/backend/app/controller_behaviors/.gitkeep" + "src/backend/app/db_migrations/.gitkeep" + "src/backend/app/interceptors/.gitkeep" + "src/backend/app/models/.gitkeep" + "src/backend/app/views/layouts/.gitkeep" + "src/backend/app/interceptors.clj" + "src/frontend/deps.cljs" + "src/frontend/base.css" + "src/frontend/hooks.clj" + "src/shared/config.clj" + "src/shared/schema.clj" + "resources/public/index.html" + "config/dev/config.edn" + "config/test/config.edn" + "project.clj" + "package.json" + "postcss.config.js" + "tailwind.config.js" + "docker-compose.yml" + "postgres-start.sh" + "README.md"]) + +(defn files + [data options] + (->> file-paths + (map (fn [path] [path (helpers/render path data)])) + (concat + [["src/backend/{{name-to-path}}.clj" (helpers/render "src/backend/app_name.clj" data)] + ["src/frontend/{{name-to-path}}/config.cljs" (helpers/render "src/frontend/app_name/config.cljs" data)] + ["src/frontend/{{name-to-path}}/core.cljs" (helpers/render "src/frontend/app_name/core.cljs" data)] + ["src/frontend/{{name-to-path}}/db.cljs" (helpers/render "src/frontend/app_name/db.cljs" data)] + ["src/frontend/{{name-to-path}}/events.cljs" (helpers/render "src/frontend/app_name/events.cljs" data)] + ["src/frontend/{{name-to-path}}/subs.cljs" (helpers/render "src/frontend/app_name/subs.cljs" data)] + ["src/frontend/{{name-to-path}}/views.cljs" (helpers/render "src/frontend/app_name/views.cljs" data)] + ["test/{{name-to-path}}_test.clj" (helpers/render "test/app_name_test.clj" data)] + [".gitignore" (helpers/render "gitignore" data)] + ["shadow-cljs.edn" (helpers/render "shadow-cljs.edn" data)] + [".hgignore" (helpers/render "hgignore" data)]]))) diff --git a/src/leiningen/new/helpers.clj b/src/leiningen/new/helpers.clj new file mode 100644 index 0000000..af0e3b1 --- /dev/null +++ b/src/leiningen/new/helpers.clj @@ -0,0 +1,23 @@ +(ns leiningen.new.helpers + (:require [leiningen.new.templates :refer [renderer sanitize name-to-path]] + [clojure.java.io :as io])) + +(def template-name "xiana") + +(def render-text (renderer template-name)) + +(defn resource-input + [resource-path] + (-> (str "leiningen/new/" (sanitize template-name) "/" resource-path) + io/resource + io/input-stream)) + +(defn render + ([resource-path] + (resource-input resource-path)) + ([resource-path data] + (render-text resource-path data))) + +(defn options? [option-name options] + (boolean + (some #{option-name} options))) diff --git a/src/leiningen/new/nubank.clj b/src/leiningen/new/nubank.clj new file mode 100644 index 0000000..9d0db68 --- /dev/null +++ b/src/leiningen/new/nubank.clj @@ -0,0 +1,9 @@ +(ns leiningen.new.nubank + (:require [leiningen.new.helpers :as helpers])) + +(def option "+nubank") + +(defn files + [data] + [["src/frontend/{{name-to-path}}/workspaces.cljs" (helpers/render "src/frontend/app_name/workspaces.cljs" data)] + ["resources/public/workspaces.html" (helpers/render "resources/public/workspaces.html" data)]]) diff --git a/src/leiningen/new/xiana.clj b/src/leiningen/new/xiana.clj index 8617238..93245ee 100644 --- a/src/leiningen/new/xiana.clj +++ b/src/leiningen/new/xiana.clj @@ -1,46 +1,50 @@ (ns leiningen.new.xiana - (:require [leiningen.new.templates :refer [multi-segment sanitize-ns renderer name-to-path ->files]] - [leiningen.core.main :as main])) + (:require [leiningen.new.templates :refer [multi-segment sanitize-ns name-to-path ->files]] + [leiningen.core.main :as main] + [leiningen.new.helpers :as helpers] + [leiningen.new.base :as base] + [leiningen.new.nubank :as nubank] + [clojure.set :as set] + [clojure.string :as st] + [clojure.string :as str])) -(def render (renderer "xiana")) +(declare template-data check-options app-files) + + +(def available-options + #{nubank/option}) (defn xiana - "FIXME: write documentation" - [name] - (let [data {:name name - :namespace (multi-segment (sanitize-ns name)) - :sanitized-name (sanitize-ns name) - :name-to-path (name-to-path name)}] - (main/info "Generating fresh 'lein new' xiana project.") - (apply ->files data (->> ["Docker/db.Dockerfile" - "Docker/init.sql" - "src/backend/app/controllers/index.clj" - "src/backend/app/controllers/re_frame.clj" - "src/backend/app/controller_behaviors/.gitkeep" - "src/backend/app/db_migrations/.gitkeep" - "src/backend/app/interceptors/.gitkeep" - "src/backend/app/models/.gitkeep" - "src/backend/app/views/layouts/.gitkeep" - "src/backend/app/interceptors.clj" - "src/frontend/deps.cljs" - "src/shared/config.clj" - "src/shared/schema.clj" - "resources/public/index.html" - "config/dev/config.edn" - "config/test/config.edn" - "project.clj" - "docker-compose.yml" - "postgres-start.sh" - "README.md"] - (map (fn [path] [path (render path data)])) - (concat - [["src/backend/{{name-to-path}}.clj" (render "src/backend/app_name.clj" data)] - ["src/frontend/{{name-to-path}}/config.cljs" (render "src/frontend/app_name/config.cljs" data)] - ["src/frontend/{{name-to-path}}/core.cljs" (render "src/frontend/app_name/core.cljs" data)] - ["src/frontend/{{name-to-path}}/db.cljs" (render "src/frontend/app_name/db.cljs" data)] - ["src/frontend/{{name-to-path}}/events.cljs" (render "src/frontend/app_name/events.cljs" data)] - ["src/frontend/{{name-to-path}}/subs.cljs" (render "src/frontend/app_name/subs.cljs" data)] - ["src/frontend/{{name-to-path}}/views.cljs" (render "src/frontend/app_name/views.cljs" data)] - ["test/{{name-to-path}}_test.clj" (render "test/app_name_test.clj" data)] - [".gitignore" (render "gitignore" data)] - [".hgignore" (render "hgignore" data)]]))))) + [name & options] + (println options) + (let [data (template-data name options)] + (check-options options) + (main/info "Generation fresh 'lein new' xiana project.") + (apply ->files data (app-files data options)))) + +(defn check-available + [options] + (let [options-set (into #{} options) + abort? (not (set/superset? available-options options-set))] + (when abort? + (main/abort "\nError: invalid option(s)\nAvailable: " + (st/join " " (sort available-options)) "\n")))) + +(defn check-options + [options] + (doto options + check-available)) + +(defn template-data + [name options] + {:name name + :namespace (multi-segment (sanitize-ns name)) + :sanitized-name (sanitize-ns name) + :name-to-path (name-to-path name) + :nubank? (helpers/options? "+nubank" options)}) + +(defn app-files + [data options] + (concat + (when (helpers/options? nubank/option options) (nubank/files data)) + (base/files data options))) From 02fb80ae284a54fe2cd2fbab7a49f42645ea3a81 Mon Sep 17 00:00:00 2001 From: narocath Date: Tue, 30 Mar 2021 14:57:43 +0300 Subject: [PATCH 2/7] cljstyle --- .../leiningen/new/xiana/dev/cljs/user.cljs | 2 +- .../src/backend/app/controllers/index.clj | 10 ++++--- .../xiana/src/backend/app/interceptors.clj | 7 +++-- .../new/xiana/src/frontend/hooks.clj | 12 +++++---- src/leiningen/new/base.clj | 27 ++++++++++--------- src/leiningen/new/helpers.clj | 14 +++++++--- src/leiningen/new/nubank.clj | 7 +++-- src/leiningen/new/xiana.clj | 27 ++++++++++++------- 8 files changed, 66 insertions(+), 40 deletions(-) diff --git a/resources/leiningen/new/xiana/dev/cljs/user.cljs b/resources/leiningen/new/xiana/dev/cljs/user.cljs index 3f4368d..64416ff 100644 --- a/resources/leiningen/new/xiana/dev/cljs/user.cljs +++ b/resources/leiningen/new/xiana/dev/cljs/user.cljs @@ -3,6 +3,6 @@ development." (:require [cljs.repl :refer (Error->map apropos dir doc error->str ex-str ex-triage - find-doc print-doc pst source)] + find-doc print-doc pst source)] [clojure.pprint :refer (pprint)] [clojure.string :as str])) diff --git a/resources/leiningen/new/xiana/src/backend/app/controllers/index.clj b/resources/leiningen/new/xiana/src/backend/app/controllers/index.clj index ed0b7b5..185369d 100644 --- a/resources/leiningen/new/xiana/src/backend/app/controllers/index.clj +++ b/resources/leiningen/new/xiana/src/backend/app/controllers/index.clj @@ -1,10 +1,12 @@ (ns controllers.index - (:require [xiana.core :as xiana] - [ring.util.response :as ring])) + (:require + [ring.util.response :as ring] + [xiana.core :as xiana])) + (defn handle-index [state] (xiana/ok (assoc state - :response - (ring/response "Index page")))) + :response + (ring/response "Index page")))) diff --git a/resources/leiningen/new/xiana/src/backend/app/interceptors.clj b/resources/leiningen/new/xiana/src/backend/app/interceptors.clj index 6068a45..15d598e 100644 --- a/resources/leiningen/new/xiana/src/backend/app/interceptors.clj +++ b/resources/leiningen/new/xiana/src/backend/app/interceptors.clj @@ -3,12 +3,15 @@ [potemkin :refer [import-vars]] [xiana.core :as xiana])) + (comment (import-vars [framework.components.app.interceptors sample-router-interceptor sample-controller-interceptor])) -(def sample-{{sanitized-name}}-controller-interceptor + +(def sample- + {{sanitized-name}} -controller-interceptor {:enter (fn [{request :request {:keys [handler controller match]} :request-data :as state}] - (xiana/ok state))}) \ No newline at end of file + (xiana/ok state))}) diff --git a/resources/leiningen/new/xiana/src/frontend/hooks.clj b/resources/leiningen/new/xiana/src/frontend/hooks.clj index 0a2ef99..5fc4f1e 100644 --- a/resources/leiningen/new/xiana/src/frontend/hooks.clj +++ b/resources/leiningen/new/xiana/src/frontend/hooks.clj @@ -4,6 +4,7 @@ [clojure.java.shell :refer [sh]] [clojure.string :as s])) + (defn exec [& cmd] (let [cmd (s/split (s/join " " (flatten cmd)) #"\s+") @@ -20,11 +21,12 @@ [build-state] (if-not (and (.isDirectory (io/file "node_modules")) (not (= 0 (count (.list (io/file "node_modules")))))) - (do (println ";;=>> 'Installing node_modules...") - (exec "npm install") - build-state) - (do (println ";;=>> 'npm is already initialized in the current project'") - build-state))) + (do (println ";;=>> 'Installing node_modules...") + (exec "npm install") + build-state) + (do (println ";;=>> 'npm is already initialized in the current project'") + build-state))) + (defn purge-css {:shadow.build/stage :flush} diff --git a/src/leiningen/new/base.clj b/src/leiningen/new/base.clj index 3239a8e..2a80ab7 100644 --- a/src/leiningen/new/base.clj +++ b/src/leiningen/new/base.clj @@ -1,5 +1,7 @@ (ns leiningen.new.base - (:require [leiningen.new.helpers :as helpers])) + (:require + [leiningen.new.helpers :as helpers])) + (def file-paths ["Docker/db.Dockerfile" @@ -28,19 +30,20 @@ "postgres-start.sh" "README.md"]) + (defn files [data options] (->> file-paths (map (fn [path] [path (helpers/render path data)])) (concat - [["src/backend/{{name-to-path}}.clj" (helpers/render "src/backend/app_name.clj" data)] - ["src/frontend/{{name-to-path}}/config.cljs" (helpers/render "src/frontend/app_name/config.cljs" data)] - ["src/frontend/{{name-to-path}}/core.cljs" (helpers/render "src/frontend/app_name/core.cljs" data)] - ["src/frontend/{{name-to-path}}/db.cljs" (helpers/render "src/frontend/app_name/db.cljs" data)] - ["src/frontend/{{name-to-path}}/events.cljs" (helpers/render "src/frontend/app_name/events.cljs" data)] - ["src/frontend/{{name-to-path}}/subs.cljs" (helpers/render "src/frontend/app_name/subs.cljs" data)] - ["src/frontend/{{name-to-path}}/views.cljs" (helpers/render "src/frontend/app_name/views.cljs" data)] - ["test/{{name-to-path}}_test.clj" (helpers/render "test/app_name_test.clj" data)] - [".gitignore" (helpers/render "gitignore" data)] - ["shadow-cljs.edn" (helpers/render "shadow-cljs.edn" data)] - [".hgignore" (helpers/render "hgignore" data)]]))) + [["src/backend/{{name-to-path}}.clj" (helpers/render "src/backend/app_name.clj" data)] + ["src/frontend/{{name-to-path}}/config.cljs" (helpers/render "src/frontend/app_name/config.cljs" data)] + ["src/frontend/{{name-to-path}}/core.cljs" (helpers/render "src/frontend/app_name/core.cljs" data)] + ["src/frontend/{{name-to-path}}/db.cljs" (helpers/render "src/frontend/app_name/db.cljs" data)] + ["src/frontend/{{name-to-path}}/events.cljs" (helpers/render "src/frontend/app_name/events.cljs" data)] + ["src/frontend/{{name-to-path}}/subs.cljs" (helpers/render "src/frontend/app_name/subs.cljs" data)] + ["src/frontend/{{name-to-path}}/views.cljs" (helpers/render "src/frontend/app_name/views.cljs" data)] + ["test/{{name-to-path}}_test.clj" (helpers/render "test/app_name_test.clj" data)] + [".gitignore" (helpers/render "gitignore" data)] + ["shadow-cljs.edn" (helpers/render "shadow-cljs.edn" data)] + [".hgignore" (helpers/render "hgignore" data)]]))) diff --git a/src/leiningen/new/helpers.clj b/src/leiningen/new/helpers.clj index af0e3b1..e75a48f 100644 --- a/src/leiningen/new/helpers.clj +++ b/src/leiningen/new/helpers.clj @@ -1,23 +1,29 @@ (ns leiningen.new.helpers - (:require [leiningen.new.templates :refer [renderer sanitize name-to-path]] - [clojure.java.io :as io])) + (:require + [clojure.java.io :as io] + [leiningen.new.templates :refer [renderer sanitize name-to-path]])) + (def template-name "xiana") (def render-text (renderer template-name)) + (defn resource-input [resource-path] (-> (str "leiningen/new/" (sanitize template-name) "/" resource-path) io/resource io/input-stream)) + (defn render ([resource-path] (resource-input resource-path)) ([resource-path data] (render-text resource-path data))) -(defn options? [option-name options] + +(defn options? + [option-name options] (boolean - (some #{option-name} options))) + (some #{option-name} options))) diff --git a/src/leiningen/new/nubank.clj b/src/leiningen/new/nubank.clj index 9d0db68..687a32f 100644 --- a/src/leiningen/new/nubank.clj +++ b/src/leiningen/new/nubank.clj @@ -1,9 +1,12 @@ (ns leiningen.new.nubank - (:require [leiningen.new.helpers :as helpers])) + (:require + [leiningen.new.helpers :as helpers])) + (def option "+nubank") + (defn files [data] [["src/frontend/{{name-to-path}}/workspaces.cljs" (helpers/render "src/frontend/app_name/workspaces.cljs" data)] - ["resources/public/workspaces.html" (helpers/render "resources/public/workspaces.html" data)]]) + ["resources/public/workspaces.html" (helpers/render "resources/public/workspaces.html" data)]]) diff --git a/src/leiningen/new/xiana.clj b/src/leiningen/new/xiana.clj index 93245ee..8c5e7bd 100644 --- a/src/leiningen/new/xiana.clj +++ b/src/leiningen/new/xiana.clj @@ -1,12 +1,14 @@ (ns leiningen.new.xiana - (:require [leiningen.new.templates :refer [multi-segment sanitize-ns name-to-path ->files]] - [leiningen.core.main :as main] - [leiningen.new.helpers :as helpers] - [leiningen.new.base :as base] - [leiningen.new.nubank :as nubank] - [clojure.set :as set] - [clojure.string :as st] - [clojure.string :as str])) + (:require + [clojure.set :as set] + [clojure.string :as st] + [clojure.string :as str] + [leiningen.core.main :as main] + [leiningen.new.base :as base] + [leiningen.new.helpers :as helpers] + [leiningen.new.nubank :as nubank] + [leiningen.new.templates :refer [multi-segment sanitize-ns name-to-path ->files]])) + (declare template-data check-options app-files) @@ -14,6 +16,7 @@ (def available-options #{nubank/option}) + (defn xiana [name & options] (println options) @@ -22,6 +25,7 @@ (main/info "Generation fresh 'lein new' xiana project.") (apply ->files data (app-files data options)))) + (defn check-available [options] (let [options-set (into #{} options) @@ -30,11 +34,13 @@ (main/abort "\nError: invalid option(s)\nAvailable: " (st/join " " (sort available-options)) "\n")))) + (defn check-options [options] (doto options check-available)) + (defn template-data [name options] {:name name @@ -43,8 +49,9 @@ :name-to-path (name-to-path name) :nubank? (helpers/options? "+nubank" options)}) + (defn app-files [data options] (concat - (when (helpers/options? nubank/option options) (nubank/files data)) - (base/files data options))) + (when (helpers/options? nubank/option options) (nubank/files data)) + (base/files data options))) From 11c50c9adcbd9cb9508f093c1bf54ffe9696a813 Mon Sep 17 00:00:00 2001 From: narocath Date: Tue, 30 Mar 2021 15:02:53 +0300 Subject: [PATCH 3/7] updated README.md --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4365e3a..dff0e2a 100644 --- a/README.md +++ b/README.md @@ -3,10 +3,13 @@ A Leiningen template for FIXME. ## Usage - +### Base only `lein new xiana DEFPROJECT-NAME --to-dir ../CUSTOM-DIR` +### With [nubank/workspaces](https://github.com/nubank/workspaces) : +`+nubank` Example: +`lein new xiana xi-example +nubank` `lein new xiana xi-example --to-dir ../lein-xiana-example` From 6bf6b922accf0ccca666916f97ccebabd38ed567 Mon Sep 17 00:00:00 2001 From: Ian Fernandez Date: Tue, 30 Mar 2021 13:19:32 -0300 Subject: [PATCH 4/7] change +nubank to +workspaces --- README.md | 4 +- resources/leiningen/new/xiana/package.json | 20 +++++--- resources/leiningen/new/xiana/project.clj | 49 ++++++++++--------- resources/leiningen/new/xiana/shadow-cljs.edn | 28 ++++++----- .../src/backend/app/controllers/re_frame.clj | 14 +++--- .../new/xiana/src/backend/app_name.clj | 2 +- .../new/{nubank.clj => workspaces.clj} | 4 +- src/leiningen/new/xiana.clj | 16 +++--- 8 files changed, 72 insertions(+), 65 deletions(-) rename src/leiningen/new/{nubank.clj => workspaces.clj} (83%) diff --git a/README.md b/README.md index dff0e2a..e581931 100644 --- a/README.md +++ b/README.md @@ -7,9 +7,9 @@ A Leiningen template for FIXME. `lein new xiana DEFPROJECT-NAME --to-dir ../CUSTOM-DIR` ### With [nubank/workspaces](https://github.com/nubank/workspaces) : -`+nubank` +`+workspaces` Example: -`lein new xiana xi-example +nubank` +`lein new xiana xi-example +workspaces` `lein new xiana xi-example --to-dir ../lein-xiana-example` diff --git a/resources/leiningen/new/xiana/package.json b/resources/leiningen/new/xiana/package.json index 7bac86c..138037f 100644 --- a/resources/leiningen/new/xiana/package.json +++ b/resources/leiningen/new/xiana/package.json @@ -1,11 +1,12 @@ { - "scripts": { - "repl": "shadow-cljs node-repl", - "test": "shadow-cljs compile test", - "build": "shadow-cljs release app", - "serve": "shadow-cljs watch app", - "prebuild": "rm ./resources/public/main.css ; postcss ./src/frontend/base.css -o ./resources/public/main.css --env production", - "preserve": "rm ./rsources/public/main.css ; postcss ./src/frontend/base.css -o ./resources/public/main.css" + "scripts": { + "repl": "shadow-cljs node-repl", + "clean": "rm -rf node_modules/ && rm -rf package-lock.json && rm -rf .shadow-cljs/ && rm -rf resources/public/js && rm -rf .lsp/", + "tests": "shadow-cljs compile ci && npx karma start --single-run", + "build": "shadow-cljs release app", + "serve": "shadow-cljs watch app", + "prebuild": "rm ./resources/public/main.css ; postcss ./src/frontend/base.css -o ./resources/public/main.css --env production", + "preserve": "rm ./rsources/public/main.css ; postcss ./src/frontend/base.css -o ./resources/public/main.css" }, "dependencies": { "highlight.js": "9.18.5", @@ -24,6 +25,9 @@ "postcss-discard-comments": "^4.0.2", "shadow-cljs": "^2.11.26", "source-map-support": "^0.4.18", - "tailwindcss": "^2.0.3" + "tailwindcss": "^2.0.3", + "@sinonjs/fake-timers": "^7.0.2", + "@testing-library/react": "^11.2.5", + "@testing-library/user-event": "^13.0.15" } } diff --git a/resources/leiningen/new/xiana/project.clj b/resources/leiningen/new/xiana/project.clj index d3f788a..c7fd7d0 100644 --- a/resources/leiningen/new/xiana/project.clj +++ b/resources/leiningen/new/xiana/project.clj @@ -1,28 +1,29 @@ (defproject {{sanitized-name}} "0.1.0-SNAPSHOT" - :description "FIXME: write description" - :min-lein-version "2.0.0" - :dependencies [[org.clojure/clojure "1.10.1"] - [com.flexiana/framework "0.1.4"] - [thheller/shadow-cljs "2.11.26"] - [clj-http "3.12.0"] - [reagent "0.10.0"] - [re-frame "1.1.2"]] - :plugins [[migratus-lein "0.7.3"] - [lein-shell "0.5.0"]] - :main ^:skip-aot {{name}} - :uberjar-name "{{name}}.jar" - :source-paths ["src/backend" "src/backend/app" "src/frontend" "src/shared"] - :clean-targets ^{:protect false} ["resources/public/js/compiled" "target"] - :profiles {:dev {:resource-paths ["config/dev"] - :dependencies [[binaryage/devtools "1.0.2"]]} - :local {:resource-paths ["config/local"]} - :prod {:resource-paths ["config/prod"]} - :test {:resource-paths ["config/test"] - :dependencies [{{#nubank?}}[nubank/workspaces "1.0.16"]{{/nubank?}} - [binaryage/devtools "1.0.2"] - [nubank/matcher-combinators "3.1.4"] - [kerodon "0.9.1"]]}} - :aliases {"ci" ["do" "clean," "cloverage," "lint," "uberjar"] + :description "FIXME: write description" + :min-lein-version "2.0.0" + :dependencies [[org.clojure/clojure "1.10.1"] + [com.flexiana/framework "0.1.4"] + [thheller/shadow-cljs "2.11.26"] + [clj-http "3.12.0"] + [reagent "0.10.0"] + [re-frame "1.1.2"]] + :plugins [[migratus-lein "0.7.3"] + [lein-shell "0.5.0"]] + :main ^:skip-aot {{name}} + :uberjar-name "{{name}}.jar" + :source-paths ["src/backend" "src/backend/app" "src/frontend" "src/shared"] + :clean-targets ^{:protect false} ["resources/public/js/compiled" "target"] + :profiles {:dev {:resource-paths ["config/dev"] + :dependencies [[binaryage/devtools "1.0.2"]]} + :local {:resource-paths ["config/local"]} + :prod {:resource-paths ["config/prod"]} + :test {:resource-paths ["config/test"] + :dependencies [{{#workspaces?}}[nubank/workspaces "1.0.16"]{{/workspaces?}} + [binaryage/devtools "1.0.2"] + [nubank/matcher-combinators "3.1.4"] + [day8.re-frame/test "0.1.5"] + [kerodon "0.9.1"]]}} + :aliases {"ci" ["do" "clean," "cloverage," "lint," "uberjar"] "kondo" ["run" "-m" "clj-kondo.main" "--lint" "src" "test"] "repl" ["with-profile" "+test" "run" "-m" "shadow.cljs.devtools.cli" "server"] "workspaces" ["with-profile" "+test" "run" "-m" "shadow.cljs.devtools.cli" "watch" "workspaces"] diff --git a/resources/leiningen/new/xiana/shadow-cljs.edn b/resources/leiningen/new/xiana/shadow-cljs.edn index ae5c414..4108346 100644 --- a/resources/leiningen/new/xiana/shadow-cljs.edn +++ b/resources/leiningen/new/xiana/shadow-cljs.edn @@ -1,15 +1,17 @@ {:lein true :nrepl {:port 8777} - :builds {:app {:target :browser - :build-hooks [(hooks/purge-css) - (hooks/npm-init)] - :output-dir "resources/public/js/app" - :asset-path "/js/app" - :modules {:main {:init-fn {{sanitized-name}}.core/init - :preloads [devtools.preload]}}} - {{#nubank?}}:workspaces {:target :browser - :output-dir "resources/public/js/workspaces" - :asset-path "/js/workspaces" - :modules {:main {:entries [{{sanitized-name}}.workspaces] - :preloads [devtools.preload]}}}{{/nubank?}} - }} + :builds {:app + {:target :browser + :build-hooks [(hooks/purge-css) + (hooks/npm-init)] + :output-dir "resources/public/js/app" + :asset-path "/js/app" + :modules {:main {:init-fn {{sanitized-name}} .core/init + :preloads [devtools.preload]}}} + {{#workspaces?}} + :workspaces + {:target :browser + :output-dir "resources/public/js/workspaces" + :asset-path "/js/workspaces" + :modules {:main {:entries [{{sanitized-name}}.workspaces] + :preloads [devtools.preload]}}} {{/workspaces?}}}} diff --git a/resources/leiningen/new/xiana/src/backend/app/controllers/re_frame.clj b/resources/leiningen/new/xiana/src/backend/app/controllers/re_frame.clj index 26d4381..c32b1d6 100644 --- a/resources/leiningen/new/xiana/src/backend/app/controllers/re_frame.clj +++ b/resources/leiningen/new/xiana/src/backend/app/controllers/re_frame.clj @@ -1,7 +1,7 @@ (ns controllers.re-frame (:require [xiana.core :as xiana] [ring.util.response :as ring])) -{{#nubank?}} +{{#workspaces?}} (defn handle-workspaces [state] (xiana/ok @@ -9,13 +9,13 @@ :response (-> "workspaces.html" (ring/resource-response {:root "public"}) - (ring/header "Content-Type" "text/html; charset=utf-8"))))){{/nubank?}} + (ring/header "Content-Type" "text/html; charset=utf-8"))))){{/workspaces?}} (defn handle-index [state] (xiana/ok - (assoc state - :response - (-> "index.html" - (ring/resource-response {:root "public"}) - (ring/header "Content-Type" "text/html; charset=utf-8"))))) + (assoc state + :response + (-> "index.html" + (ring/resource-response {:root "public"}) + (ring/header "Content-Type" "text/html; charset=utf-8"))))) diff --git a/resources/leiningen/new/xiana/src/backend/app_name.clj b/resources/leiningen/new/xiana/src/backend/app_name.clj index 9997d71..35c4424 100644 --- a/resources/leiningen/new/xiana/src/backend/app_name.clj +++ b/resources/leiningen/new/xiana/src/backend/app_name.clj @@ -14,7 +14,7 @@ (def routes [["/" {:controller index/handle-index}] ["/re-frame" {:controller re-frame/handle-index}] - {{#nubank?}}["/workspaces" {:controller re-frame/handle-workspaces}]{{/nubank?}} + {{#workspaces?}}["/workspaces" {:controller re-frame/handle-workspaces}]{{/workspaces?}} ["/assets/*" (ring/create-resource-handler)]]) (defn system diff --git a/src/leiningen/new/nubank.clj b/src/leiningen/new/workspaces.clj similarity index 83% rename from src/leiningen/new/nubank.clj rename to src/leiningen/new/workspaces.clj index 687a32f..172490c 100644 --- a/src/leiningen/new/nubank.clj +++ b/src/leiningen/new/workspaces.clj @@ -1,9 +1,9 @@ -(ns leiningen.new.nubank +(ns leiningen.new.workspaces (:require [leiningen.new.helpers :as helpers])) -(def option "+nubank") +(def option "+workspaces") (defn files diff --git a/src/leiningen/new/xiana.clj b/src/leiningen/new/xiana.clj index 8c5e7bd..852cabc 100644 --- a/src/leiningen/new/xiana.clj +++ b/src/leiningen/new/xiana.clj @@ -6,15 +6,15 @@ [leiningen.core.main :as main] [leiningen.new.base :as base] [leiningen.new.helpers :as helpers] - [leiningen.new.nubank :as nubank] - [leiningen.new.templates :refer [multi-segment sanitize-ns name-to-path ->files]])) + [leiningen.new.templates :refer [multi-segment sanitize-ns name-to-path ->files]] + [leiningen.new.workspaces :as workspaces])) (declare template-data check-options app-files) (def available-options - #{nubank/option}) + #{workspaces/option}) (defn xiana @@ -43,15 +43,15 @@ (defn template-data [name options] - {:name name - :namespace (multi-segment (sanitize-ns name)) + {:name name + :namespace (multi-segment (sanitize-ns name)) :sanitized-name (sanitize-ns name) - :name-to-path (name-to-path name) - :nubank? (helpers/options? "+nubank" options)}) + :name-to-path (name-to-path name) + :workspaces? (helpers/options? "+workspaces" options)}) (defn app-files [data options] (concat - (when (helpers/options? nubank/option options) (nubank/files data)) + (when (helpers/options? workspaces/option options) (workspaces/files data)) (base/files data options))) From 3a4d785fdfc331c19ed619a9530911c4f7d2dca6 Mon Sep 17 00:00:00 2001 From: Ian Fernandez Date: Tue, 30 Mar 2021 13:27:31 -0300 Subject: [PATCH 5/7] Add example test for main-panel --- .../xiana/src/frontend/app_name/views.cljs | 3 +- .../test/frontend/app_name/views_test.clj | 25 +++++ .../new/xiana/test/frontend/test_utils.cljs | 92 +++++++++++++++++++ 3 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 resources/leiningen/new/xiana/test/frontend/app_name/views_test.clj create mode 100644 resources/leiningen/new/xiana/test/frontend/test_utils.cljs diff --git a/resources/leiningen/new/xiana/src/frontend/app_name/views.cljs b/resources/leiningen/new/xiana/src/frontend/app_name/views.cljs index a881fad..9fa4100 100644 --- a/resources/leiningen/new/xiana/src/frontend/app_name/views.cljs +++ b/resources/leiningen/new/xiana/src/frontend/app_name/views.cljs @@ -7,5 +7,6 @@ (defn main-panel [] (let [name (re-frame/subscribe [::subs/name])] [:div - [:h1 "Hello from " @name] + [:h1 {:data-testid "hello"} + "Hello from " @name] ])) diff --git a/resources/leiningen/new/xiana/test/frontend/app_name/views_test.clj b/resources/leiningen/new/xiana/test/frontend/app_name/views_test.clj new file mode 100644 index 0000000..6822667 --- /dev/null +++ b/resources/leiningen/new/xiana/test/frontend/app_name/views_test.clj @@ -0,0 +1,25 @@ +(ns frontend.{{sanitized-name}}.views-test + (:require [cljs.test :as t + :include-macros true + :refer [are is testing deftest]] + [re-frame.core :as re-frame] + [{{sanitized-name}}.db :as db] + [{{sanitized-name}}.views :as views] + [matcher-combinators.test :refer [match?]] + [frankie.views :as views] + [frankie.db :as db] + [reagent.core :as r] + [frontend.test-utils :as u] + [re-frame.core :as rf] + [day8.re-frame.test :as rf-test])) + +(rf/clear-subscription-cache!) + +(deftest example-counter-test + (rf-test/run-test-sync + (let [rendered-div # (.getByTestId % "hello")] + (u/rf-with-mounted-component + db/default-db + [views/main-panel] + (fn [comp] + (is (= "Hello from re-frame" (rendered-div comp)))))))) diff --git a/resources/leiningen/new/xiana/test/frontend/test_utils.cljs b/resources/leiningen/new/xiana/test/frontend/test_utils.cljs new file mode 100644 index 0000000..937662e --- /dev/null +++ b/resources/leiningen/new/xiana/test/frontend/test_utils.cljs @@ -0,0 +1,92 @@ +(ns frontend.test-utils + (:require + ["@sinonjs/fake-timers" :as timer] + ["@testing-library/react" :as rtl] + ["@testing-library/user-event" :as rtue] + [goog.dom :as gdom] + [reagent.core :as r] + [re-frame.core :as rf])) + +(def test-container-id "tests-container") +(defn create-tests-container! + [] + (let [container (gdom/createDom "div" #js {:id test-container-id})] + (gdom/appendChild (-> js/document .-body) container) + container)) + +(defn with-mounted-component + [comp f] + (let [container (create-tests-container!) + mounted-component (rtl/render (r/as-element comp) + #js {"container" container})] + (try + (f mounted-component) + (finally + (rtl/cleanup))))) + +(defn rf-with-mounted-component + [initial-db comp f] + (let [container (create-tests-container!) + mounted-component (rtl/render (r/as-element comp) + #js {"container" container})] + (rf/reg-event-db + ::test-db + (fn [_ _] + initial-db)) + (rf/dispatch-sync [::test-db]) + (try + (f mounted-component) + (finally + (rtl/cleanup))))) + +(defn ->action-map + [v] + (clj->js (if (map? v) + v + {:target {:value v}}))) + +(defn click-element! + ([el] + (click-element! el {})) + ([el v-or-m] + (let [click-fn! (.. rtue -default -click)] + (click-fn! el (->action-map v-or-m))) + (r/flush))) + +(defn double-click-element! + ([el] + (let [click-fn! (.. rtue -default -dblClick)] + (click-fn! el {})) + (r/flush))) + +(defn submit! + [el] + (.submit rtl/fireEvent el) + (r/flush)) + +(defn click-context-menu! + [el] + (.contextMenu rtl/fireEvent el) + (r/flush)) + +(defn input-element! + [el v-or-m] + (.input rtl/fireEvent el (->action-map v-or-m)) + (r/flush)) + +(defn change-element! + [el v-or-m] + (.change rtl/fireEvent el (->action-map v-or-m)) + (r/flush)) + +(defn install-timer + [] + (.install timer (.-getTime js/Date.))) + +(defn tick + [t x] + (.tick t x)) + +(defn uninstall-timer + [t] + (.uninstall t)) From c876f7dca7da00622626c8a7433ad9fa4582e789 Mon Sep 17 00:00:00 2001 From: narocath Date: Wed, 31 Mar 2021 10:16:41 +0300 Subject: [PATCH 6/7] comment's fixes --- resources/leiningen/new/xiana/src/backend/app_name.clj | 2 +- src/leiningen/new/xiana.clj | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/resources/leiningen/new/xiana/src/backend/app_name.clj b/resources/leiningen/new/xiana/src/backend/app_name.clj index 35c4424..646c119 100644 --- a/resources/leiningen/new/xiana/src/backend/app_name.clj +++ b/resources/leiningen/new/xiana/src/backend/app_name.clj @@ -41,7 +41,7 @@ (let [config (config/edn)] (component/start (system config)))) -(def st +(defonce st (-> (config/edn) system atom)) diff --git a/src/leiningen/new/xiana.clj b/src/leiningen/new/xiana.clj index 852cabc..db1e2da 100644 --- a/src/leiningen/new/xiana.clj +++ b/src/leiningen/new/xiana.clj @@ -1,8 +1,7 @@ (ns leiningen.new.xiana (:require - [clojure.set :as set] - [clojure.string :as st] - [clojure.string :as str] + [clojure.set :as clset] + [clojure.string :as clstring] [leiningen.core.main :as main] [leiningen.new.base :as base] [leiningen.new.helpers :as helpers] @@ -29,10 +28,10 @@ (defn check-available [options] (let [options-set (into #{} options) - abort? (not (set/superset? available-options options-set))] + abort? (not (clset/superset? available-options options-set))] (when abort? (main/abort "\nError: invalid option(s)\nAvailable: " - (st/join " " (sort available-options)) "\n")))) + (clstring/join " " (sort available-options)) "\n")))) (defn check-options From 9af416d45f7f4c6648a20e9f48825aec0f84140d Mon Sep 17 00:00:00 2001 From: narocath Date: Thu, 1 Apr 2021 10:24:30 +0300 Subject: [PATCH 7/7] cljstyle --- resources/leiningen/new/xiana/shadow-cljs.edn | 4 ++-- .../leiningen/new/xiana/src/frontend/hooks.clj | 15 +++++---------- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/resources/leiningen/new/xiana/shadow-cljs.edn b/resources/leiningen/new/xiana/shadow-cljs.edn index 4108346..d60b12c 100644 --- a/resources/leiningen/new/xiana/shadow-cljs.edn +++ b/resources/leiningen/new/xiana/shadow-cljs.edn @@ -2,8 +2,8 @@ :nrepl {:port 8777} :builds {:app {:target :browser - :build-hooks [(hooks/purge-css) - (hooks/npm-init)] + :build-hooks [(hooks/purge-css!) + (hooks/npm-init!)] :output-dir "resources/public/js/app" :asset-path "/js/app" :modules {:main {:init-fn {{sanitized-name}} .core/init diff --git a/resources/leiningen/new/xiana/src/frontend/hooks.clj b/resources/leiningen/new/xiana/src/frontend/hooks.clj index 5fc4f1e..11103b9 100644 --- a/resources/leiningen/new/xiana/src/frontend/hooks.clj +++ b/resources/leiningen/new/xiana/src/frontend/hooks.clj @@ -4,7 +4,6 @@ [clojure.java.shell :refer [sh]] [clojure.string :as s])) - (defn exec [& cmd] (let [cmd (s/split (s/join " " (flatten cmd)) #"\s+") @@ -15,8 +14,7 @@ (println out)) (println err)))) - -(defn npm-init +(defn npm-init! {:shadow.build/stage :configure} [build-state] (if-not (and (.isDirectory (io/file "node_modules")) @@ -27,8 +25,7 @@ (do (println ";;=>> 'npm is already initialized in the current project'") build-state))) - -(defn purge-css +(defn purge-css! {:shadow.build/stage :flush} [build-state] (case (:shadow.build/mode build-state) @@ -38,9 +35,7 @@ (exec "npm run-script prebuild") build-state) :dev - (if (not (.exists (io/file "resources/public/main.css"))) - (do - (println ";;=> 'Runnnig preserve script'") - (exec "npm run-script preserve") - build-state) + (do + (println ";;=> 'Runnnig preserve script'") + (exec "npm run-script preserve") build-state)))