diff --git a/deps.edn b/deps.edn index 946a5f1..55284da 100644 --- a/deps.edn +++ b/deps.edn @@ -5,7 +5,8 @@ metosin/jsonista {:mvn/version "0.3.8"} day8.re-frame/re-frame-10x {:mvn/version "1.9.3"} pjstadig/humane-test-output {:mvn/version "0.11.0"} - thheller/shadow-cljs {:mvn/version "2.26.2"}} + thheller/shadow-cljs {:mvn/version "2.26.2"} + io.github.nenadalm/clojure-utils {:git/sha "42cbaa203eff28afe99512164874c9b57d750ba0" :git/url "https://github.com/nenadalm/clojure-tools.git"}} :aliases {:dev {:extra-paths ["dev"]} :cljfmt {:extra-deps {cljfmt/cljfmt {:mvn/version "0.9.2"}} diff --git a/src/nenadalm/clojure_utils/README.md b/src/nenadalm/clojure_utils/README.md deleted file mode 100644 index 566e862..0000000 --- a/src/nenadalm/clojure_utils/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# Clojure utils - -This repo contains various utils, guides, … on writing apps using Clojure. It’s not meant to be anything universal, just some stuff I would copy-paste among projects without it + some guides/notes on how I do some things. - -## App version - -App version should be specified using [meta element](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta). - -example -```html - -``` - -## App state - -Should be fully serializable to support autosave feature (`nenadalm.clojure-utils.re-frame.autosave`). Without this feature, app state is lost when app is closed (can easilly happen accidentaly). - -## Cache busting - -Shadow cljs [build hooks](https://shadow-cljs.github.io/docs/UsersGuide.html#build-hooks) should be used to render html and other resources to make everything work smoothly. `nenadalm.clojure-utils.assets` ns helps with asset names. diff --git a/src/nenadalm/clojure_utils/assets.clj b/src/nenadalm/clojure_utils/assets.clj deleted file mode 100644 index e50febb..0000000 --- a/src/nenadalm/clojure_utils/assets.clj +++ /dev/null @@ -1,91 +0,0 @@ -(ns nenadalm.clojure-utils.assets - (:require - [clojure.java.io :as io])) - -(defn- sha-1 [s] - (let [c (java.security.MessageDigest/getInstance "sha-1")] - (.update c (.getBytes s "utf-8")) - (reduce (fn [s b] (str s (format "%02x" b))) "" (.digest c)))) - -(defn- file-hash [f] - (-> f - slurp - sha-1)) - -(defn- path [s] - (java.nio.file.Paths/get s (make-array java.lang.String 0))) - -(defn- symlink [link target] - (let [link-path (path link) - target-rel (.relativize (.getParent link-path) - (path target))] - (.mkdirs (.toFile (.getParent link-path))) - (java.nio.file.Files/createSymbolicLink link-path target-rel (make-array java.nio.file.attribute.FileAttribute 0)))) - -(defn- copy [src target] - (let [target-f (io/file target)] - (.mkdirs (.getParentFile target-f)) - (io/copy - (io/file src) - target-f))) - -(defn- file-name->file-name-and-extension [s] - (let [ext-index (.lastIndexOf s ".")] - (if (== -1 ext-index) - [s] - [(.substring s 0 ext-index) (.substring s (inc ext-index))]))) - -(defn- hashed-asset [asset hash] - (let [asset-path (path asset) - dir (.getParent asset-path) - asset-file-name (.getFileName asset-path) - [asset-name asset-ext] (file-name->file-name-and-extension (.toString asset-file-name)) - target (str (when dir (str dir "/")) asset-name "." hash (when asset-ext (str "." asset-ext)))] - target)) - -(comment - (hashed-asset "app" "hash") - (hashed-asset "app.js" "hash") - (hashed-asset "js/app.js" "hash") - ;; - ) - -(defn- symlink-assets [{:keys [public-dir assets]}] - (doseq [[asset src] assets] - (symlink (str public-dir "/" asset) src)) - {}) - -(defn- hash-assets [{:keys [public-dir assets]}] - (reduce - (fn [acc [asset src]] - (let [hash (file-hash src) - asset-path (hashed-asset asset hash) - target (str public-dir "/" asset-path)] - (copy src target) - (assoc acc asset asset-path))) - {} - assets)) - -(defn create - "opts: - - `:public-dir` - - `:assets` - map where key is asset path and value file path" - [build-state asset-opts] - (case (:shadow.build/mode build-state) - :release (hash-assets asset-opts) - (symlink-assets asset-opts))) - -(defn from-modules - "opts: - - `:public-dir`" - [build-state {:keys [public-dir]}] - (let [output-dir (get-in build-state [:shadow.build/config :output-dir]) - path-prefix (str (.relativize - (path public-dir) - (path output-dir)) - "/")] - (-> (group-by (fn [m] - (str path-prefix (m :module-name))) - (:shadow.build.closure/modules build-state)) - (update-vals (fn [coll] - (str path-prefix (-> coll first :output-name))))))) diff --git a/src/nenadalm/clojure_utils/cljs.cljs b/src/nenadalm/clojure_utils/cljs.cljs deleted file mode 100644 index 096d50f..0000000 --- a/src/nenadalm/clojure_utils/cljs.cljs +++ /dev/null @@ -1,18 +0,0 @@ -(ns nenadalm.clojure-utils.cljs) - -(defn- request-screen [wake-lock] - (.request wake-lock "screen")) - -(defn prevent-screen-lock [] - (when-some [wake-lock (.-wakeLock js/navigator)] - (-> (request-screen wake-lock) - (.then (fn [] - (js/document.addEventListener - "visibilitychange" - (fn [_] - (when (= "visible" (.-visibilityState js/document)) - (request-screen wake-lock))))))))) - -(defn app-version [] - (some-> (js/document.querySelector "meta[name=app-version]") - (.getAttribute "content"))) diff --git a/src/nenadalm/clojure_utils/re_frame/autosave.cljs b/src/nenadalm/clojure_utils/re_frame/autosave.cljs deleted file mode 100644 index d1d8fef..0000000 --- a/src/nenadalm/clojure_utils/re_frame/autosave.cljs +++ /dev/null @@ -1,34 +0,0 @@ -(ns nenadalm.clojure-utils.re-frame.autosave - (:require - [re-frame.core :as re-frame] - [clojure.edn :as edn] - [nenadalm.clojure-utils.re-frame.local-storage :as ls])) - -(defn init [autosave-key] - (re-frame/reg-event-fx - ::autosave - (fn [{:keys [db]}] - {::ls/set {autosave-key (pr-str db)}})) - - (re-frame/reg-event-fx - ::autosave-remove - (fn [_] - {::ls/remove [autosave-key]})) - - (re-frame/reg-event-fx - ::autosave-load - [(re-frame/inject-cofx ::ls/get {:autosave-str autosave-key})] - (fn [cofx] - (if-let [autosave (edn/read-string (:autosave-str cofx))] - {:db autosave - ::ls/remove [autosave-key]} - {}))) - - (re-frame/dispatch-sync [::autosave-load]) - (js/document.addEventListener - "visibilitychange" - (fn [] - (case (.-visibilityState js/document) - "visible" (re-frame/dispatch [::autosave-remove]) - "hidden" (re-frame/dispatch [::autosave]) - nil)))) diff --git a/src/nenadalm/clojure_utils/re_frame/local_storage.cljs b/src/nenadalm/clojure_utils/re_frame/local_storage.cljs deleted file mode 100644 index d6f28fc..0000000 --- a/src/nenadalm/clojure_utils/re_frame/local_storage.cljs +++ /dev/null @@ -1,24 +0,0 @@ -(ns nenadalm.clojure-utils.re-frame.local-storage - (:require - [re-frame.core :as re-frame])) - -(re-frame/reg-fx - ::set - (fn [kv] - (doseq [[k v] kv] - (js/window.localStorage.setItem k v)))) - -(re-frame/reg-cofx - ::get - (fn [coeffects kv] - (reduce-kv - (fn [m k v] - (assoc m k (js/window.localStorage.getItem v))) - coeffects - kv))) - -(re-frame/reg-fx - ::remove - (fn [ks] - (doseq [k ks] - (js/window.localStorage.removeItem k))))