diff --git a/.dir-locals.el b/.dir-locals.el index 01afde7..d1da6a8 100644 --- a/.dir-locals.el +++ b/.dir-locals.el @@ -1,5 +1,5 @@ ((clojure-mode . ((cider-preferred-build-tool . clojure-cli) (cider-default-cljs-repl . shadow) - (cider-shadow-default-options . "app") + (cider-shadow-default-options . "frontend") (cider-offer-to-open-cljs-app-in-browser . nil) - (cider-clojure-cli-aliases . ":test/env:dev/reloaded")))) + (cider-clojure-cli-aliases . ":test/env")))) diff --git a/.dockerignore b/.dockerignore index 25421cc..e0b6056 100644 --- a/.dockerignore +++ b/.dockerignore @@ -24,3 +24,4 @@ !test/ !test-data/ !resources/ +!public/ diff --git a/.gitignore b/.gitignore index aa46f39..dc43b29 100644 --- a/.gitignore +++ b/.gitignore @@ -1,22 +1,10 @@ -# ------------------------ -# Clojure Project Git Ignore file patterns -# -# Ignore all except patterns starting with ! -# Add comments on separate lines, not same line as pattern -# ------------------------ - -# ------------------------ # Ignore everthing in root directory /* -# ------------------------ -# Common project files !CHANGELOG.md !README.md !LICENSE -# ------------------------ -# Include Clojure project & config !build.clj !deps.edn !pom.xml @@ -24,12 +12,15 @@ !docs/ !src/ !test/ -!config.edn - -# Don't ignore resources !resources/ -# ...but ignore shadow-cljs build artifacts -resources/public/js + +# ------------------------ +# Public directory rules +!public/ +# Handle js subdirectory specifically +!public/js/ +public/js/* +!public/js/.keep # ------------------------ # Include Clojure tools @@ -43,7 +34,6 @@ resources/public/js # ------------------------ # Frontend things -!cljs !shadow-cljs.edn !package.json !bun.lockb @@ -54,11 +44,6 @@ resources/public/js !.gitignore !.github/ -# ------------------------ -# Include ClojureScript Figwheel -!figwheel-main.edn -!*.cljs.edn - # ------------------------ # Include deployment related files !config diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index bee0b81..0000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,22 +0,0 @@ -# apossiblespace/parts Changelog - -All notable changes to this project will be documented in this file. -The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) - -* **Added** for new features -* **Changed** for changes in existing functionality -* **Deprecated** for soon-to-be removed features -* **Resolved** resolved issue -* **Security** vulnerability related change - -## [Unreleased] - -### Changed - -## 0.1.0 - 2024-08-06 - -### Added - -* [#1](https://github.com/practicalli/clojure/issues/1) Created apossiblespace/parts project with deps-new using practicalli.template/service - -[Unreleased]: https://github.com/apossiblespace/parts/compare/0.1.1...HEAD diff --git a/Dockerfile b/Dockerfile index 8d7b340..6e4f52f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,26 +1,5 @@ -# ------------------------------------------ -# Build and run Practicalli Gameboard API Service -# -# Author: Practicalli -# -# Builder image: -# Official Clojure Docker image with Java 17 (eclipse-temurin) and Clojure CLI -# https://hub.docker.com/_/clojure/ -# -# Run-time image: -# Official Java Docker image with Java 17 (eclipse-temurin) -# https://hub.docker.com/_/eclipse-temurin -# ------------------------------------------ - - -# ------------------------ -# Setup Builder container - FROM clojure:temurin-17-alpine AS builder -# Set Clojure CLI version (defaults to latest release) -# ENV CLOJURE_VERSION=1.11.1.1413 - # Create directory for project code (working directory) RUN mkdir -p /build @@ -40,14 +19,6 @@ RUN apk add --no-cache nodejs npm RUN npm install - -# ------------------------ -# Test and Package application via Makefile -# `make all` calls `deps`, `test-ci`, `dist` and `clean` tasks -# using shared library cache mounted by pipeline process - -RUN npx shadow-cljs release app - # `dist` task packages Clojure service as an uberjar # - creates: /build/practicalli-gameboard-api-service.jar # - uses command `clojure -T:build uberjar` @@ -94,7 +65,7 @@ USER clojure # Copy service archive file from Builder image WORKDIR /app -COPY --from=builder /build/target/tools-ifs-parts-standalone.jar /app/ +COPY --from=builder /build/target/parts-standalone.jar /app/ # Optional: Add System Integration testing scripts # RUN mkdir -p /app/test-scripts @@ -136,7 +107,7 @@ ENV JDK_JAVA_OPTIONS="-XshowSettings:system -XX:+UseContainerSupport -XX:MaxRAMP # Start service using dumb-init and java run-time # (overrides `jshell` entrypoint - default in eclipse-temuring image) ENTRYPOINT ["/usr/bin/dumb-init", "--"] -CMD ["java", "-jar", "/app/tools-ifs-parts-standalone.jar"] +CMD ["java", "-jar", "/app/parts-standalone.jar"] # Docker Entrypoint documentation diff --git a/Makefile b/Makefile index fbfc92c..e63e324 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,6 @@ # - `:env/dev` to include `dev` directory on class path # - `:env/test` to include `test` directory and libraries to support testing # - `:test/run` to run kaocha kaocha test runner and supporting paths and dependencies -# - `:repl/rebel` to start a Rebel terminal UI # - `:package/uberjar` to create an uberjar for the service # - docker # - mega-linter-runner @@ -28,7 +27,8 @@ HELP-DESCRIPTION-SPACING := 24 # Tool variables -MEGALINTER_RUNNER = npx mega-linter-runner --flavor java --env "'MEGALINTER_CONFIG=.github/config/megalinter.yaml'" --remove-container +FORMATTER_RUNNER = bunx @chrisoakman/standard-clojure-style +MEGALINTER_RUNNER = bunx mega-linter-runner --flavor java --env "'MEGALINTER_CONFIG=.github/config/megalinter.yaml'" --remove-container CLOJURE_TEST_RUNNER = clojure -M:test/env:test/run CLOJURE_EXEC_TEST_RUNNER = clojure -X:test/env:test/run @@ -48,15 +48,15 @@ help: ## Describe available tasks in Makefile # ------------------------------------ # # ------- Clojure Development -------- # -repl: ## Run Clojure REPL with rich terminal UI (Rebel Readline) - $(info --------- Run Rebel REPL ---------) - clojure -M:test/env:repl/reloaded +repl: ## Run Clojure REPL + $(info --------- Run REPL with Shadow ---------) + clojure -M -m shadow.cljs.devtools.cli clj-repl deps: deps.edn ## Prepare dependencies for test and dist targets $(info --------- Download test and service libraries ---------) clojure -P -X:build -dist: build-uberjar ## Build and package Clojure service +dist: build-frontend build-uberjar ## Build and package Clojure service $(info --------- Build and Package Clojure service ---------) # Remove files and directories after build tasks @@ -101,6 +101,10 @@ build-jar: ## Build a jar archive of Clojure project $(info --------- Build library jar ---------) clojure -T:build/task jar +build-frontend: ## Build shadow-cljs frontend app + $(info --------- Build frontend ---------) + clojure -M -m shadow.cljs.devtools.cli release frontend + build-uberjar: ## Build a uberjar archive of Clojure project & Clojure runtime $(info --------- Build service Uberjar ---------) clojure -T:build/task uberjar @@ -111,16 +115,17 @@ build-clean: ## Clean build assets or given directory # ------------------------------------ # # ------- Code Quality --------------- # -pre-commit-check: format-check lint test ## Run format, lint and test targets +pre-commit-check: format lint test ## Run format, lint and test targets -format-check: ## Run cljstyle to check the formatting of Clojure code +format: ## Run cljstyle to check the formatting of Clojure code $(info --------- standard-clojure-style-js Runner ---------) - standard-clj check . + $(FORMATTER_RUNNER) check . format-fix: ## Run cljstyle and fix the formatting of Clojure code $(info --------- standard-clojure-style-js Runner ---------) - standard-clj fix . + $(FORMATTER_RUNNER) fix . +# TODO: Reconsider how useful this is lint: ## Run MegaLinter with custom configuration (node.js required) $(info --------- MegaLinter Runner ---------) $(MEGALINTER_RUNNER) diff --git a/build.clj b/build.clj index e7ae07b..55ae783 100644 --- a/build.clj +++ b/build.clj @@ -30,9 +30,9 @@ (def project-config "Project configuration to support all tasks" {:class-directory "target/classes" - :main-namespace 'tools.ifs/parts + :main-namespace 'parts/server :project-basis (build-api/create-basis) - :uberjar-file "target/tools-ifs-parts-standalone.jar"}) + :uberjar-file "target/parts-standalone.jar"}) (defn config "Display build configuration" @@ -63,7 +63,7 @@ (let [config (merge project-config options) {:keys [class-directory main-namespace project-basis uberjar-file]} config] (clean "target") - (build-api/copy-dir {:src-dirs ["src" "resources"] + (build-api/copy-dir {:src-dirs ["src/main" "resources" "public"] :target-dir class-directory}) (build-api/compile-clj {:basis project-basis @@ -74,6 +74,3 @@ :class-dir class-directory :main main-namespace :uber-file uberjar-file}))) - -;; End of Build tasks -;; --------------------------------------------------------- diff --git a/bun.lockb b/bun.lockb index cffb42a..53f3cce 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/cljs/tools/ifs/parts/core.cljs b/cljs/tools/ifs/parts/core.cljs deleted file mode 100644 index a02c27c..0000000 --- a/cljs/tools/ifs/parts/core.cljs +++ /dev/null @@ -1,32 +0,0 @@ -(ns tools.ifs.parts.core - (:require - ["reactflow" :refer [Background Controls ReactFlow ReactFlowProvider]] - [uix.core :refer [$ defui]] - [uix.dom])) - -(def initial-nodes - [{:id "1" :data {:label "1"} :position {:x 250 :y 25}} - {:id "2" :data {:label "2"} :position {:x 250 :y 125}}]) - -(def initial-edges - [{:id "e1-2" :source "1" :target "2"}]) - -(defui flow-diagram [] - (let [[nodes set-nodes] (uix.core/use-state initial-nodes) - [edges set-edges] (uix.core/use-state initial-edges)] - ($ ReactFlowProvider - ($ :div {:style {:width "100%" :height "600px"}} - ($ ReactFlow - {:nodes (clj->js nodes) - :edges (clj->js edges) - :fitView true}) - ($ Background) - ($ Controls))))) - -(defonce root - (uix.dom/create-root (js/document.getElementById "root"))) - -(defn ^:export init [] - (uix.dom/render-root - ($ flow-diagram) - root)) diff --git a/compose.yaml b/compose.yaml index b404889..97bcf15 100644 --- a/compose.yaml +++ b/compose.yaml @@ -13,7 +13,7 @@ name: "parts" services: # --- Clojure Service --- # - parts-ifs-tools: + parts: platform: linux/amd64 # Build using Dockerfile - relative path or Git repository build: diff --git a/deps.edn b/deps.edn index 95576f8..fd3f0aa 100644 --- a/deps.edn +++ b/deps.edn @@ -1,26 +1,25 @@ -{;; --------------------------------------------------------- - :paths - ["src" "resources" "cljs"] - ;; --------------------------------------------------------- - - ;; --------------------------------------------------------- +{:paths ["src/main" "src/dev" "resources"] :deps - {;; Service - org.clojure/clojure {:mvn/version "1.12.0"} - com.brunobonacci/mulog {:mvn/version "0.9.0"} + {org.clojure/clojure {:mvn/version "1.12.0"} http-kit/http-kit {:mvn/version "2.8.0"} metosin/reitit {:mvn/version "0.7.2"} - metosin/muuntaja {:mvn/version "0.6.10"} + ;; + ;; Auth-related things buddy/buddy-auth {:mvn/version "3.0.323"} buddy/buddy-hashers {:mvn/version "2.0.167"} - com.github.seancorfield/next.jdbc {:mvn/version "1.3.955"} - org.xerial/sqlite-jdbc {:mvn/version "3.47.0.0"} + ;; + ;; Database-related things + com.github.seancorfield/next.jdbc {:mvn/version "1.3.981"} + org.xerial/sqlite-jdbc {:mvn/version "3.48.0.0"} migratus/migratus {:mvn/version "1.6.3"} - com.github.seancorfield/honeysql {:mvn/version "2.6.1203"} + com.github.seancorfield/honeysql {:mvn/version "2.6.1270"} + ring/ring-json {:mvn/version "0.5.1"} ring/ring-mock {:mvn/version "0.4.0"} - ;; Simple logging implementation using by Buddy for ex + + ;; Logging org.slf4j/slf4j-simple {:mvn/version "2.0.16"} + com.brunobonacci/mulog {:mvn/version "0.9.0"} ;; ;; A small library for explicit, intentful configuration. ;; https://github.com/juxt/aero @@ -30,37 +29,30 @@ ;; secure default configurations of Ring middleware for both websites and HTTP ;; APIs. ;; https://github.com/ring-clojure/ring-defaults - ring/ring-defaults {:mvn/version "0.5.0"} + ring/ring-defaults {:mvn/version "0.6.0"} ;; ;; Hiccup is a library for representing HTML in Clojure. It uses vectors to ;; represent elements, and maps to represent an element's attributes. ;; https://github.com/weavejester/hiccup - hiccup/hiccup {:mvn/version "2.0.0-RC3"} + hiccup/hiccup {:mvn/version "2.0.0-RC4"} ;; ;; Clojurescript ;; https://github.com/clojure/clojurescript - org.clojure/clojurescript {:mvn/version "1.11.132"}} + org.clojure/clojurescript {:mvn/version "1.11.132"} + ;; + ;; shadow-cljs + ;; https://code.thheller.com/blog/shadow-cljs/2024/10/18/fullstack-cljs-workflow-with-shadow-cljs.html + thheller/shadow-cljs {:mvn/version "2.28.20"} + cider/cider-nrepl {:mvn/version "0.51.1"} + refactor-nrepl/refactor-nrepl {:mvn/version "3.10.0"}} - ;; --------------------------------------------------------- :aliases - {;; ------------ - ;; Clojure.main execution of application - :run/app - {:main-opts ["-m" "tools.ifs.parts"]} + {:run/app + {:main-opts ["-m" "parts.server"]} - ;; Clojure.exec execution of specified function - :run/greet - {:exec-fn tools.ifs.parts/greet - :exec-args {:name "Clojure"}} - ;; ------------ - - ;; ------------ - ;; Add libraries and paths to support additional test tools :test/env {} - ;; Test runner - local and CI - ;; call with :watch? true to start file watcher and re-run tests on saved changes :test/run {:extra-paths ["test"] :extra-deps {lambdaisland/kaocha {:mvn/version "1.91.1392"}} @@ -69,20 +61,12 @@ :exec-fn kaocha.runner/exec-fn :exec-args {:randomize? false :fail-fast? false}} - ;; ------------ - - ;; ------------ - ;; tools.build `build.clj` built script :build/task {:replace-paths ["."] - :replace-deps {io.github.clojure/tools.build {:mvn/version "0.10.5"}} + :replace-deps {io.github.clojure/tools.build {:mvn/version "0.10.6"}} :ns-default build} - ;; ------------ - ;; ------------ ;; Updating dependencies with clojure -M:antq --upgrade :antq - {:deps {com.github.liquidz/antq {:mvn/version "2.10.1241"}} + {:deps {com.github.liquidz/antq {:mvn/version "2.11.1264"}} :main-opts ["-m" "antq.core"]}}} -;; ------------ -;; --------------------------------------------------------- diff --git a/dev/mulog_events.clj b/dev/mulog_events.clj deleted file mode 100644 index fa68482..0000000 --- a/dev/mulog_events.clj +++ /dev/null @@ -1,55 +0,0 @@ -;; --------------------------------------------------------- -;; Mulog Global Context and Custom Publisher -;; -;; - set event log global context -;; - tap publisher for use with Portal and other tap sources -;; - publish all mulog events to Portal tap source -;; --------------------------------------------------------- - -(ns mulog-events - (:require - [com.brunobonacci.mulog :as mulog] - [com.brunobonacci.mulog.buffer :as mulog-buffer])) - -;; --------------------------------------------------------- -;; Set event global context -;; - information added to every event for REPL workflow -(mulog/set-global-context! {:app-name "parts Service" - :version "0.1.0", :env "dev"}) -;; --------------------------------------------------------- - -;; --------------------------------------------------------- -;; Mulog event publishing - -(deftype TapPublisher - [buffer transform] - com.brunobonacci.mulog.publisher.PPublisher - (agent-buffer [_] buffer) - (publish-delay [_] 200) - (publish [_ buffer] - (doseq [item (transform (map second (mulog-buffer/items buffer)))] - (tap> item)) - (mulog-buffer/clear buffer))) - -#_{:clj-kondo/ignore [:unused-private-var]} -(defn ^:private tap-events - [{:keys [transform] :as _config}] - (TapPublisher. (mulog-buffer/agent-buffer 10000) (or transform identity))) - -(def tap-publisher - "Start mulog custom tap publisher to send all events to Portal - and other tap sources - `mulog-tap-publisher` to stop publisher" - (mulog/start-publisher! - {:type :custom, :fqn-function "mulog-events/tap-events"})) - -#_{:clj-kondo/ignore [:unused-public-var]} -(defn stop - "Stop mulog tap publisher to ensure multiple publishers are not started - Recommended before using `(restart)` or evaluating the `user` namespace" - [] - tap-publisher) - -;; Example mulog event message -;; (mulog/log ::dev-user-ns :message "Example event message" :ns (ns-publics *ns*)) -;; --------------------------------------------------------- diff --git a/dev/portal.clj b/dev/portal.clj deleted file mode 100644 index bf371fb..0000000 --- a/dev/portal.clj +++ /dev/null @@ -1,23 +0,0 @@ -(ns portal - (:require - ;; Data inspector - [portal.api :as inspect])) - -;; --------------------------------------------------------- -;; Start Portal and capture all evaluation results - -;; Open Portal window in browser with dark theme -;; https://cljdoc.org/d/djblue/portal/0.37.1/doc/ui-concepts/themes -;; Portal options: -;; - light theme {:portal.colors/theme :portal.colors/solarized-light} -;; - dark theme {:portal.colors/theme :portal.colors/gruvbox} - -(def instance - "Open portal window if no portal sessions have been created. - A portal session is created when opening a portal window" - (or (seq (inspect/sessions)) - (inspect/open {:portal.colors/theme :portal.colors/gruvbox}))) - -;; Add portal as tapsource (add to clojure.core/tapset) -(add-tap #'portal.api/submit) -;; --------------------------------------------------------- diff --git a/dev/test.http b/dev/test.http deleted file mode 100644 index 295bf68..0000000 --- a/dev/test.http +++ /dev/null @@ -1,27 +0,0 @@ -# Test requests for restclient.el - -# Health check -GET http://localhost:3000/api/ping - -# Working login -POST http://localhost:3000/api/auth/login -Content-Type: application/json - -{ - "email": "test2@example.com", - "password": "password2" -} - -# Failing login -POST http://localhost:3000/api/auth/login -Content-Type: application/json - -{ - "email": "bob@bobson.com", - "password": "4321tset" -} - -# Get account info -GET http://localhost:3000/api/account -Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjMwMDAvYXBpIiwic3ViIjoiY2M1YTVkMTYtYjgzYS00OTZkLTk5M2EtOTM2ZjQxOGUxZDNlIiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDozMDAwIiwiaWF0IjoxNzI1NjMzODgzLCJleHAiOjE3MjU2Mzc0ODN9.hDjmDNvy2MNwGP6Th0Jl8THSq9bbg6APv4WndbvOBUk -Content-Type: application/json diff --git a/dev/user.clj b/dev/user.clj deleted file mode 100644 index 584d0e8..0000000 --- a/dev/user.clj +++ /dev/null @@ -1,118 +0,0 @@ -;; --------------------------------------------------------- -;; REPL workflow development tools -;; -;; Include development tool libraries vai aliases from practicalli/clojure-cli-config -;; Start Rich Terminal UI REPL prompt: -;; `clojure -M:repl/reloaded` -;; -;; Or call clojure jack-in from an editor to start a repl -;; including the `:dev/reloaded` alias -;; - alias included in the Emacs `.dir-locals.el` file -;; --------------------------------------------------------- - -(ns user - "Tools for REPL Driven Development" - (:require - [clojure.tools.namespace.repl :as namespace] - [com.brunobonacci.mulog :as mulog] ; Global context & Tap publisher - ;; REPL Workflow - [mulog-events] ; Event Logging - [portal] - [portal.api :as inspect] ; Data inspector - [tools.ifs.parts :as parts] - [tools.ifs.parts.api.account :as account] - [tools.ifs.parts.api.auth :as auth] - [tools.ifs.parts.api.middleware :as middleware] - [tools.ifs.parts.config :as config] - [tools.ifs.parts.db :as db])) - -;; --------------------------------------------------------- -;; Help - -(println "---------------------------------------------------------") -(println "Loading custom user namespace tools...") -(println "---------------------------------------------------------") - -(defn help - [] - (println "---------------------------------------------------------") - (println "Namesapece Management:") - (println "(namespace/refresh) ; refresh all changed namespaces") - (println "(namespace/refresh-all) ; refresh all namespaces") - (println) - (println "Hotload libraries: ; Clojure 1.12.x") - (println "(add-lib 'library-name)") - (println "(add-libs '{domain/library-name {:mvn/version \"v1.2.3\"}})") - (println "(sync-deps) ; load dependencies from deps.edn") - (println "- deps-* lsp snippets for adding library") - (println) - (println "Portal Inspector:") - (println "- portal started by default, listening to all evaluations") - (println "(inspect/clear) ; clear all values in portal") - (println "(remove-tap #'inspect/submit) ; stop sending to portal") - (println "(inspect/close) ; close portal") - (println) - (println "Mulog Publisher:") - (println "- mulog publisher started by default") - (println "(mulog-events/stop) ; stop publishing log events") - (println) - (println "(help) ; print help text") - (println "---------------------------------------------------------")) - -(help) - -;; End of Help -;; --------------------------------------------------------- - -;; --------------------------------------------------------- -;; Avoid reloading `dev` code -;; - code in `dev` directory should be evaluated if changed to reload into repl -(println - "Set REPL refresh directories to " - (namespace/set-refresh-dirs "src" "resources")) -;; --------------------------------------------------------- - -;; --------------------------------------------------------- -;; Mulog event logging -;; `mulog-publisher` namespace used to launch tap> events to tap-source (portal) -;; `mulog-events` namespace sets mulog global context for all events - -;; Example mulog event message -(mulog/log ::dev-user-ns - :message "Example event from user namespace" - :ns (ns-publics *ns*)) -;; --------------------------------------------------------- - -;; --------------------------------------------------------- -;; Hotload libraries into running REPL -;; `deps-*` LSP snippets to add dependency forms -(comment - ;; Require for Clojure 1.11.x and earlier - (require '[clojure.tools.deps.alpha.repl :refer [add-libs]]) - (add-libs '{domain/library-name {:mvn/version "1.0.0"}}) - - ;; Clojure 1.12.x only - #_(add-lib 'library-name) ; find and add library - #_(sync-deps) ; load dependencies in deps.edn (if not yet loaded) - #_()) ; End of rich comment -;; --------------------------------------------------------- - -;; --------------------------------------------------------- -;; Portal Data Inspector -(comment - ;; Open a portal inspector in browser window - light theme - ;; (inspect/open {:portal.colors/theme :portal.colors/solarized-light}) - - (inspect/clear) ; Clear all values in portal window (allows garbage collection) - - (remove-tap #'inspect/submit) ; Remove portal from `tap>` sources - - (inspect/close) ; Close the portal window - - (inspect/docs) ; View docs locally via Portal - - (mulog-events/stop) ; stop publishing log events - - #_()) ; End of rich comment - -;; --------------------------------------------------------- diff --git a/package.json b/package.json index 8631280..4e51306 100644 --- a/package.json +++ b/package.json @@ -1,13 +1,8 @@ { "dependencies": { - "d3": "^7.9.0", "htmx.org": "^2.0.2", "react": "^19.0.0", "react-dom": "^19.0.0", - "reactflow": "^11.11.4", - "shadow-cljs": "^2.28.15" - }, - "scripts": { - "watch": "shadow-cljs watch app" + "reactflow": "^11.11.4" } } diff --git a/resources/public/css/flow.css b/public/css/flow.css similarity index 100% rename from resources/public/css/flow.css rename to public/css/flow.css diff --git a/resources/public/css/style.css b/public/css/style.css similarity index 100% rename from resources/public/css/style.css rename to public/css/style.css diff --git a/resources/public/images/avatars/gosha.svg b/public/images/avatars/gosha.svg similarity index 100% rename from resources/public/images/avatars/gosha.svg rename to public/images/avatars/gosha.svg diff --git a/resources/public/images/avatars/tingyi.svg b/public/images/avatars/tingyi.svg similarity index 100% rename from resources/public/images/avatars/tingyi.svg rename to public/images/avatars/tingyi.svg diff --git a/resources/public/images/icons/favicon.png b/public/images/icons/favicon.png similarity index 100% rename from resources/public/images/icons/favicon.png rename to public/images/icons/favicon.png diff --git a/resources/public/images/nodes/exile.svg b/public/images/nodes/exile.svg similarity index 100% rename from resources/public/images/nodes/exile.svg rename to public/images/nodes/exile.svg diff --git a/resources/public/images/nodes/firefighter.svg b/public/images/nodes/firefighter.svg similarity index 100% rename from resources/public/images/nodes/firefighter.svg rename to public/images/nodes/firefighter.svg diff --git a/resources/public/images/nodes/manager.svg b/public/images/nodes/manager.svg similarity index 100% rename from resources/public/images/nodes/manager.svg rename to public/images/nodes/manager.svg diff --git a/resources/public/images/parts-logo-horizontal.svg b/public/images/parts-logo-horizontal.svg similarity index 100% rename from resources/public/images/parts-logo-horizontal.svg rename to public/images/parts-logo-horizontal.svg diff --git a/resources/public/images/system-illustration.svg b/public/images/system-illustration.svg similarity index 100% rename from resources/public/images/system-illustration.svg rename to public/images/system-illustration.svg diff --git a/resources/public/js/.keep b/public/js/.keep similarity index 100% rename from resources/public/js/.keep rename to public/js/.keep diff --git a/resources/migrations/20240821000000-create-users-table.up.sql b/resources/migrations/20240821000000-create-users-table.up.sql index 82f82fa..5cda577 100644 --- a/resources/migrations/20240821000000-create-users-table.up.sql +++ b/resources/migrations/20240821000000-create-users-table.up.sql @@ -15,3 +15,4 @@ FOR EACH ROW BEGIN UPDATE users SET updated_at = CURRENT_TIMESTAMP WHERE id = OLD.id; END; +--;; diff --git a/shadow-cljs.edn b/shadow-cljs.edn index cab4678..9ac974c 100644 --- a/shadow-cljs.edn +++ b/shadow-cljs.edn @@ -1,20 +1,8 @@ -{:source-paths - ["cljs"] - - :dependencies - [[cider/cider-nrepl "0.51.1"] - [refactor-nrepl/refactor-nrepl "3.10.0"]] - - :nrepl - {:middleware [cider.nrepl/cider-middleware - refactor-nrepl.middleware/wrap-refactor] - :port 50655} - +{:deps true + :nrepl {:init-ns repl} :builds - {:app + {:frontend {:target :browser - :output-dir "resources/public/js" - :asset-path "/js" - :modules {:main {:init-fn tools.ifs.parts.core/init}} - :devtools {:http-root "resources/public" - :http-port 8020}}}} + :modules {:main {:init-fn parts.frontend.app/init}} + :devtools {:watch-dir "public"} + :optimizations :advanced}}} diff --git a/src/dev/repl.clj b/src/dev/repl.clj new file mode 100644 index 0000000..1953375 --- /dev/null +++ b/src/dev/repl.clj @@ -0,0 +1,26 @@ +(ns repl + (:require + [parts.server :as server] + [shadow.cljs.devtools.api :as shadow] + [shadow.cljs.devtools.server :as shadow-server])) + +(defonce server-ref (atom nil)) + +;; TODO: Do we also want to open Inspector automatically? +(defn start [] + (shadow-server/start!) + (shadow/watch :frontend) + + (reset! server-ref + (server/-main)) + ::started) + +(defn stop [] + (when-some [stop-server @server-ref] + (reset! server-ref nil) + (stop-server)) + ::stopped) + +(defn go [] + (stop) + (start)) diff --git a/src/tools/ifs/parts/api/account.clj b/src/main/parts/api/account.clj similarity index 92% rename from src/tools/ifs/parts/api/account.clj rename to src/main/parts/api/account.clj index 1592bd4..75b56ce 100644 --- a/src/tools/ifs/parts/api/account.clj +++ b/src/main/parts/api/account.clj @@ -1,8 +1,8 @@ -(ns tools.ifs.parts.api.account +(ns parts.api.account (:require [com.brunobonacci.mulog :as mulog] - [ring.util.response :as response] - [tools.ifs.parts.entity.user :as user])) + [parts.entity.user :as user] + [ring.util.response :as response])) (defn get-account "Retrieve own account info" diff --git a/src/tools/ifs/parts/api/auth.clj b/src/main/parts/api/auth.clj similarity index 89% rename from src/tools/ifs/parts/api/auth.clj rename to src/main/parts/api/auth.clj index 30a2e48..7aad7cd 100644 --- a/src/tools/ifs/parts/api/auth.clj +++ b/src/main/parts/api/auth.clj @@ -1,8 +1,8 @@ -(ns tools.ifs.parts.api.auth +(ns parts.api.auth (:require [com.brunobonacci.mulog :as mulog] - [ring.util.response :as response] - [tools.ifs.parts.auth :as auth])) + [parts.auth :as auth] + [ring.util.response :as response])) (defn login [request] diff --git a/src/tools/ifs/parts/auth.clj b/src/main/parts/auth.clj similarity index 95% rename from src/tools/ifs/parts/auth.clj rename to src/main/parts/auth.clj index 0f9a9f4..8e0bbb0 100644 --- a/src/tools/ifs/parts/auth.clj +++ b/src/main/parts/auth.clj @@ -1,11 +1,11 @@ -(ns tools.ifs.parts.auth +(ns parts.auth (:require [buddy.auth.backends :as backends] [buddy.hashers :as hashers] [buddy.sign.jwt :as jwt] [com.brunobonacci.mulog :as mulog] - [tools.ifs.parts.config :as conf] - [tools.ifs.parts.db :as db]) + [parts.config :as conf] + [parts.db :as db]) (:import (java.time Instant))) diff --git a/src/tools/ifs/parts/config.clj b/src/main/parts/config.clj similarity index 94% rename from src/tools/ifs/parts/config.clj rename to src/main/parts/config.clj index 7442f7d..b29e877 100644 --- a/src/tools/ifs/parts/config.clj +++ b/src/main/parts/config.clj @@ -1,4 +1,4 @@ -(ns tools.ifs.parts.config +(ns parts.config (:require [aero.core :as aero] [clojure.java.io :as io])) diff --git a/src/tools/ifs/parts/db.clj b/src/main/parts/db.clj similarity index 97% rename from src/tools/ifs/parts/db.clj rename to src/main/parts/db.clj index 39ac429..a44b757 100644 --- a/src/tools/ifs/parts/db.clj +++ b/src/main/parts/db.clj @@ -1,4 +1,4 @@ -(ns tools.ifs.parts.db +(ns parts.db (:require [clojure.string :as str] [com.brunobonacci.mulog :as mulog] @@ -6,7 +6,7 @@ [migratus.core :as migratus] [next.jdbc :as jdbc] [next.jdbc.result-set :as rs] - [tools.ifs.parts.config :as conf]) + [parts.config :as conf]) (:import (java.util UUID))) diff --git a/src/tools/ifs/parts/entity/user.clj b/src/main/parts/entity/user.clj similarity index 96% rename from src/tools/ifs/parts/entity/user.clj rename to src/main/parts/entity/user.clj index f16f940..31fa762 100644 --- a/src/tools/ifs/parts/entity/user.clj +++ b/src/main/parts/entity/user.clj @@ -1,7 +1,7 @@ -(ns tools.ifs.parts.entity.user +(ns parts.entity.user (:require - [tools.ifs.parts.auth :as auth] - [tools.ifs.parts.db :as db])) + [parts.auth :as auth] + [parts.db :as db])) (def allowed-update-fields #{:email :display_name :password}) (def sensitive-fields #{:password_hash}) diff --git a/src/main/parts/frontend/app.cljs b/src/main/parts/frontend/app.cljs new file mode 100644 index 0000000..7aba8fc --- /dev/null +++ b/src/main/parts/frontend/app.cljs @@ -0,0 +1,9 @@ +(ns parts.frontend.app + (:require + ["htmx.org" :default htmx])) + +(defn ^:export init [] + (.on htmx "htmx:load" + (fn [evt] + (let [version (.-version htmx)] + (js/console.log "HTMX loaded! Version:" version))))) diff --git a/src/tools/ifs/parts/pages.clj b/src/main/parts/handlers/pages.clj similarity index 81% rename from src/tools/ifs/parts/pages.clj rename to src/main/parts/handlers/pages.clj index fe50611..4490251 100644 --- a/src/tools/ifs/parts/pages.clj +++ b/src/main/parts/handlers/pages.clj @@ -1,27 +1,27 @@ -(ns tools.ifs.parts.pages +(ns parts.handlers.pages (:require [hiccup2.core :refer [html]] - [ring.util.response :as response] - [tools.ifs.parts.layouts.main :refer [layout]] - [tools.ifs.parts.layouts.partials :refer [footer header waitlist-signup-form]])) + [parts.views.layouts :as layouts] + [parts.views.partials :as partials] + [ring.util.response :as response])) (defn system-graph "Page rendering the graph of a system" - [system-id] + [_] (response/response (html - (layout "System" - [:section.container - [:div.content - [:div [:h2 "System"]] - [:div#root]]])))) + (layouts/main "System" + [:section.container + [:div.content + [:div [:h2 "System"]] + [:div#root]]])))) (defn home-page "Page rendered for GET /" [_] (-> (response/response (html - (layout + (layouts/main "Mapping tools for IFS practitioners and their clients" [:section.container [:div.content @@ -39,7 +39,7 @@ [:p [:strong "Parts"] " is being actively developed, and we would love to have your feedback! Please enter your email below to join the private beta test."] - (waitlist-signup-form ".signup")]]]] + (partials/waitlist-signup-form ".signup")]]]] [:section.aboutus.container [:div.content [:h3 diff --git a/src/tools/ifs/parts/waitlist.clj b/src/main/parts/handlers/waitlist.clj similarity index 90% rename from src/tools/ifs/parts/waitlist.clj rename to src/main/parts/handlers/waitlist.clj index 3321dab..4a07944 100644 --- a/src/tools/ifs/parts/waitlist.clj +++ b/src/main/parts/handlers/waitlist.clj @@ -1,11 +1,11 @@ -(ns tools.ifs.parts.waitlist +(ns parts.handlers.waitlist (:require [clojure.string :as str] [com.brunobonacci.mulog :as mulog] [hiccup2.core :refer [html]] - [ring.util.response :as response] - [tools.ifs.parts.db :as db] - [tools.ifs.parts.layouts.partials :as partials])) + [parts.db :as db] + [parts.views.partials :as partials] + [ring.util.response :as response])) (defn- valid-email? "Check if the email is valid" diff --git a/src/tools/ifs/parts/api/middleware.clj b/src/main/parts/middleware.clj similarity index 94% rename from src/tools/ifs/parts/api/middleware.clj rename to src/main/parts/middleware.clj index 3b12740..8ab6efb 100644 --- a/src/tools/ifs/parts/api/middleware.clj +++ b/src/main/parts/middleware.clj @@ -1,17 +1,18 @@ -(ns tools.ifs.parts.api.middleware +(ns parts.middleware (:require [buddy.auth :refer [authenticated?]] [buddy.auth.middleware :refer [wrap-authentication wrap-authorization]] [clojure.string :as str] [com.brunobonacci.mulog :as mulog] + [parts.auth :as auth] [reitit.ring.middleware.exception :as exception] [ring.middleware.content-type :refer [wrap-content-type]] [ring.middleware.defaults :refer [site-defaults wrap-defaults]] - [ring.middleware.resource :refer [wrap-resource]] + [ring.middleware.file :refer [wrap-file]] + [ring.middleware.file-info :refer [wrap-file-info]] [ring.middleware.session :refer [wrap-session]] [ring.middleware.session.cookie :refer [cookie-store]] - [ring.util.response :as response] - [tools.ifs.parts.auth :as auth]) + [ring.util.response :as response]) (:import (org.sqlite SQLiteException))) @@ -92,7 +93,8 @@ ;; TODO: Use secure-site-defaults for production (wrap-defaults (-> site-defaults (assoc-in [:session :store] (cookie-store)))) - (wrap-resource "public") + (wrap-file "public") + (wrap-file-info) (wrap-session) (wrap-content-type))) diff --git a/src/tools/ifs/parts.clj b/src/main/parts/server.clj similarity index 74% rename from src/tools/ifs/parts.clj rename to src/main/parts/server.clj index fa0ad8b..06f4863 100644 --- a/src/tools/ifs/parts.clj +++ b/src/main/parts/server.clj @@ -1,35 +1,32 @@ -;; --------------------------------------------------------- -;; tools.ifs.parts -;; -;; Parts is a toolkit for therapists working with the Internal Family Systems -;; model (https://en.wikipedia.org/wiki/Internal_Family_Systems_Model). It -;; provides a tool for easy, collaborative parts mapping, which can be used to -;; facilitate conversations with clients during sessions. - -;; --------------------------------------------------------- - -(ns tools.ifs.parts +(ns parts.server (:require [com.brunobonacci.mulog :as mulog] [org.httpkit.server :as server] + [parts.api.account :as account] + [parts.api.auth :as auth] + [parts.db :as db] + [parts.handlers.pages :as pages] + [parts.handlers.waitlist :as waitlist] + [parts.middleware :as middleware] [reitit.coercion.spec] [reitit.ring :as ring] [reitit.swagger :as swagger] [reitit.swagger-ui :as swagger-ui] [ring.middleware.json :refer [wrap-json-body wrap-json-response]] - [ring.middleware.params :refer [wrap-params]] - [tools.ifs.parts.api.account :as account] - [tools.ifs.parts.api.auth :as auth] - [tools.ifs.parts.api.middleware :as middleware] - [tools.ifs.parts.db :as db] - [tools.ifs.parts.pages :as pages] - [tools.ifs.parts.waitlist :as waitlist]) + [ring.middleware.params :refer [wrap-params]]) (:gen-class)) -;; --------------------------------------------------------- -;; Application +;; (def app +;; (middleware/wrap-default-middlewares +;; (ring/ring-handler +;; (ring/router +;; [["/" {:get +;; {:handler (fn [req] +;; (tap> req) ;; This will display req in the inspector +;; {:status 200}) +;; }}]])))) -(def prelaunch-app +(def app (middleware/wrap-default-middlewares (ring/ring-handler (ring/router @@ -54,7 +51,7 @@ ;; ;; It is also entirely possible that API routes will be removed, and only HTML ;; routes will remain. -(def app +(def api (middleware/wrap-default-middlewares (ring/ring-handler (ring/router @@ -99,7 +96,7 @@ "Starts the web server" [port] (mulog/log ::starting-server :port port) - (server/run-server #'prelaunch-app {:port port})) + (server/run-server #'app {:port port})) (defn -main "Entry point into the application via clojure.main -M" @@ -114,14 +111,3 @@ (fn [] (stop-fn) (println "Parts: Server stopped."))))) - -;; --------------------------------------------------------- - -;; --------------------------------------------------------- -;; Rick Comment -#_{:clj-kondo/ignore [:redefined-var]} -(comment - (def stop-server (-main)) - (stop-server) - #_()) ; End of rich comment block -;; --------------------------------------------------------- diff --git a/src/tools/ifs/parts/layouts/main.clj b/src/main/parts/views/layouts.clj similarity index 90% rename from src/tools/ifs/parts/layouts/main.clj rename to src/main/parts/views/layouts.clj index 4d33576..6955cb7 100644 --- a/src/tools/ifs/parts/layouts/main.clj +++ b/src/main/parts/views/layouts.clj @@ -1,9 +1,9 @@ -(ns tools.ifs.parts.layouts.main +(ns parts.views.layouts (:require [hiccup2.core :refer [html]] - [tools.ifs.parts.layouts.partials :refer [footer header]])) + [parts.views.partials :as partials])) -(defn layout +(defn main "Fundamental application layout" [title & content] (html @@ -24,7 +24,7 @@ :data-domain "parts.ifs.tools" :src "https://plausible.io/js/script.outbound-links.tagged-events.js"}]] [:body - (header) + (partials/header) content - (footer) + (partials/footer) [:script {:src "/js/main.js"}]])) diff --git a/src/tools/ifs/parts/layouts/partials.clj b/src/main/parts/views/partials.clj similarity index 95% rename from src/tools/ifs/parts/layouts/partials.clj rename to src/main/parts/views/partials.clj index 1517a30..9f1e437 100644 --- a/src/tools/ifs/parts/layouts/partials.clj +++ b/src/main/parts/views/partials.clj @@ -1,4 +1,4 @@ -(ns tools.ifs.parts.layouts.partials +(ns parts.views.partials (:require [ring.middleware.anti-forgery :refer [*anti-forgery-token*]])) @@ -17,7 +17,7 @@ [:div.content [:div.copyright [:p - "© 2024 " + "© 2025 " [:a {:href "https://a.possible.space"} "A Possible Space Ltd"] [:br] "Company number 11617016"]] diff --git a/test/tools/ifs/parts/api/account_test.clj b/test/parts/api/account_test.clj similarity index 93% rename from test/tools/ifs/parts/api/account_test.clj rename to test/parts/api/account_test.clj index 03f8231..7bcbd06 100644 --- a/test/tools/ifs/parts/api/account_test.clj +++ b/test/parts/api/account_test.clj @@ -1,10 +1,10 @@ -(ns tools.ifs.parts.api.account-test +(ns parts.api.account-test (:require [clojure.test :refer [deftest is testing use-fixtures]] - [tools.ifs.helpers.test-factory :as factory] - [tools.ifs.helpers.test-helpers :refer [register-test-user with-test-db]] - [tools.ifs.parts.api.account :as account] - [tools.ifs.parts.db :as db])) + [parts.api.account :as account] + [parts.db :as db] + [parts.helpers.test-factory :as factory] + [parts.helpers.utils :refer [register-test-user with-test-db]])) (use-fixtures :once with-test-db) diff --git a/test/tools/ifs/parts/api/auth_test.clj b/test/parts/api/auth_test.clj similarity index 92% rename from test/tools/ifs/parts/api/auth_test.clj rename to test/parts/api/auth_test.clj index 676d9ac..d38a663 100644 --- a/test/tools/ifs/parts/api/auth_test.clj +++ b/test/parts/api/auth_test.clj @@ -1,13 +1,13 @@ -(ns tools.ifs.parts.api.auth-test +(ns parts.api.auth-test (:require [buddy.sign.jwt :as jwt] [clojure.test :refer [deftest is testing use-fixtures]] - [tools.ifs.helpers.test-factory :as factory] - [tools.ifs.helpers.test-helpers :refer [with-test-db]] - [tools.ifs.parts.api.account :as account] - [tools.ifs.parts.api.auth :as auth] - [tools.ifs.parts.auth :as auth-utils] - [tools.ifs.parts.entity.user :as user]) + [parts.api.account :as account] + [parts.api.auth :as auth] + [parts.auth :as auth-utils] + [parts.entity.user :as user] + [parts.helpers.test-factory :as factory] + [parts.helpers.utils :refer [with-test-db]]) (:import (java.time Instant))) diff --git a/test/tools/ifs/parts/auth_test.clj b/test/parts/auth_test.clj similarity index 91% rename from test/tools/ifs/parts/auth_test.clj rename to test/parts/auth_test.clj index 8b21aba..98f078c 100644 --- a/test/tools/ifs/parts/auth_test.clj +++ b/test/parts/auth_test.clj @@ -1,11 +1,11 @@ -(ns tools.ifs.parts.auth-test +(ns parts.auth-test (:require [buddy.sign.jwt :as jwt] [clojure.test :refer [deftest is testing use-fixtures]] - [tools.ifs.helpers.test-factory :as factory] - [tools.ifs.helpers.test-helpers :refer [with-test-db]] - [tools.ifs.parts.auth :as auth] - [tools.ifs.parts.entity.user :as user]) + [parts.auth :as auth] + [parts.entity.user :as user] + [parts.helpers.test-factory :as factory] + [parts.helpers.utils :refer [with-test-db]]) (:import (java.time Instant))) diff --git a/test/tools/ifs/parts/entity/user_test.clj b/test/parts/entity/user_test.clj similarity index 95% rename from test/tools/ifs/parts/entity/user_test.clj rename to test/parts/entity/user_test.clj index db7f9ed..69ca087 100644 --- a/test/tools/ifs/parts/entity/user_test.clj +++ b/test/parts/entity/user_test.clj @@ -1,9 +1,9 @@ -(ns tools.ifs.parts.entity.user-test +(ns parts.entity.user-test (:require [clojure.test :refer [deftest is testing use-fixtures]] - [tools.ifs.helpers.test-factory :as factory] - [tools.ifs.helpers.test-helpers :refer [register-test-user with-test-db]] - [tools.ifs.parts.entity.user :as user])) + [parts.entity.user :as user] + [parts.helpers.test-factory :as factory] + [parts.helpers.utils :refer [register-test-user with-test-db]])) (use-fixtures :once with-test-db) diff --git a/test/tools/ifs/parts/waitlist_test.clj b/test/parts/handlers/waitlist_test.clj similarity index 90% rename from test/tools/ifs/parts/waitlist_test.clj rename to test/parts/handlers/waitlist_test.clj index 9168291..083be03 100644 --- a/test/tools/ifs/parts/waitlist_test.clj +++ b/test/parts/handlers/waitlist_test.clj @@ -1,11 +1,11 @@ -(ns tools.ifs.parts.waitlist-test +(ns parts.handlers.waitlist-test (:require [clojure.string :as str] [clojure.test :refer [deftest is testing use-fixtures]] - [tools.ifs.helpers.test-helpers :refer [with-test-db]] - [tools.ifs.parts.api.middleware :as middleware] - [tools.ifs.parts.db :as db] - [tools.ifs.parts.waitlist :as waitlist])) + [parts.db :as db] + [parts.handlers.waitlist :as waitlist] + [parts.helpers.utils :refer [with-test-db]] + [parts.middleware :as middleware])) (use-fixtures :once with-test-db) diff --git a/test/tools/ifs/helpers/test_factory.clj b/test/parts/helpers/test_factory.clj similarity index 93% rename from test/tools/ifs/helpers/test_factory.clj rename to test/parts/helpers/test_factory.clj index 22e5ed6..74260db 100644 --- a/test/tools/ifs/helpers/test_factory.clj +++ b/test/parts/helpers/test_factory.clj @@ -1,4 +1,4 @@ -(ns tools.ifs.helpers.test-factory) +(ns parts.helpers.test-factory) (def ^:private counter (atom 0)) diff --git a/test/tools/ifs/helpers/test_helpers.clj b/test/parts/helpers/utils.clj similarity index 90% rename from test/tools/ifs/helpers/test_helpers.clj rename to test/parts/helpers/utils.clj index 06ae5cc..0fa9f27 100644 --- a/test/tools/ifs/helpers/test_helpers.clj +++ b/test/parts/helpers/utils.clj @@ -1,11 +1,11 @@ -(ns tools.ifs.helpers.test-helpers +(ns parts.helpers.utils (:require [clojure.tools.logging :as log] [migratus.core :as migratus] [next.jdbc :as jdbc] - [tools.ifs.helpers.test-factory :as factory] - [tools.ifs.parts.config :as conf] - [tools.ifs.parts.entity.user :as user])) + [parts.config :as conf] + [parts.entity.user :as user] + [parts.helpers.test-factory :as factory])) (defn setup-test-db [] diff --git a/test/tools/ifs/parts/api/middleware_test.clj b/test/parts/middleware_test.clj similarity index 97% rename from test/tools/ifs/parts/api/middleware_test.clj rename to test/parts/middleware_test.clj index c9a5745..335b11f 100644 --- a/test/tools/ifs/parts/api/middleware_test.clj +++ b/test/parts/middleware_test.clj @@ -1,9 +1,9 @@ -(ns tools.ifs.parts.api.middleware-test +(ns parts.middleware-test (:require [clojure.test :refer [deftest is testing]] + [parts.middleware :as middleware] [reitit.ring :as ring] - [ring.mock.request :as mock] - [tools.ifs.parts.api.middleware :as middleware]) + [ring.mock.request :as mock]) (:import (org.sqlite SQLiteErrorCode SQLiteException))) diff --git a/tests.edn b/tests.edn index 0513579..8786e44 100644 --- a/tests.edn +++ b/tests.edn @@ -1,13 +1,4 @@ -;; --------------------------------------------------------- ;; Kaocha test runner configuration -;; -;; Default configuration -;; - show current config using either command: -;; -;; make test-config -;; -;; clojure -M:test/env:test/run --print-config - -;; --------------------------------------------------------- +;; clj -M:test/env:test/run --print-config #kaocha/v1 {}