From 41db21ae646ea90704ea4802fbaf753e976143a3 Mon Sep 17 00:00:00 2001 From: Phil Jackson Date: Sat, 21 Oct 2023 18:03:23 +0100 Subject: [PATCH 1/7] lsp and kondo in ignore. --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index c7535bc..b10f8ad 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,5 @@ pom.xml.asc /.idea .hgignore .hg/ +/.lsp/ +/.clj-kondo/ From aa81f2b7f127fd9759f97e8ced8240db37c616e9 Mon Sep 17 00:00:00 2001 From: Phil Jackson Date: Sat, 21 Oct 2023 18:05:17 +0100 Subject: [PATCH 2/7] New fn for generating unique class names. --- src/main/shadow/css.clj | 2 +- src/main/shadow/css/build.cljc | 4 ++-- src/main/shadow/css/specs.cljc | 29 ++++++++++++++++++++--------- 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/main/shadow/css.clj b/src/main/shadow/css.clj index 3c611ab..5a984b6 100644 --- a/src/main/shadow/css.clj +++ b/src/main/shadow/css.clj @@ -37,7 +37,7 @@ ;; but may end up emitting invalid references in code ;; which again is fine in JS since it'll just be undefined css-id - (s/generate-id ns-str line column) + (s/generate-id (vec body)) passthrough (->> body diff --git a/src/main/shadow/css/build.cljc b/src/main/shadow/css/build.cljc index 1f0b108..14802ef 100644 --- a/src/main/shadow/css/build.cljc +++ b/src/main/shadow/css/build.cljc @@ -187,8 +187,8 @@ (let [all-rules (->> (for [ns (:chunk-namespaces chunk) :let [{:keys [ns css] :as ns-info} (get namespaces ns)] - {:keys [line column] :as form-info} css - :let [css-id (s/generate-id ns line column)]] + {:keys [form] :as form-info} css + :let [css-id (s/generate-id form)]] (-> (ana/process-form build-state form-info) (assoc :ns ns diff --git a/src/main/shadow/css/specs.cljc b/src/main/shadow/css/specs.cljc index 520ef5f..c5890f1 100644 --- a/src/main/shadow/css/specs.cljc +++ b/src/main/shadow/css/specs.cljc @@ -1,6 +1,7 @@ (ns shadow.css.specs (:require [clojure.spec.alpha :as s] - [clojure.string :as str])) + [clojure.string :as str] + [clojure.walk :refer [postwalk]])) (s/def ::alias keyword?) @@ -94,11 +95,21 @@ {:parts [] :invalid true :body body :spec (s/explain-data ::class-def body)} conformed))) -(defn generate-id [ns line column] - (str (-> (str ns) - (str/replace #"\." "_") - (munge)) - "__" - "L" line - "_" - "C" column)) \ No newline at end of file +(defn generate-id + "Generates a class name which is unique given the contents. Please have a look + at the tests for more information." + [rules] + (str "sc-" (postwalk + (fn [rule] + (cond + ;; postwalk will give you a vector pair for a map before it + ;; gives you the actual map + (map-entry? rule) + rule + + (vector? rule) + (hash (sort rule)) + + :else + (hash rule))) + rules))) From c766db3bd0de3dfdaa7eca9e71dba8957aaed0e4 Mon Sep 17 00:00:00 2001 From: Phil Jackson Date: Sat, 21 Oct 2023 19:30:06 +0100 Subject: [PATCH 3/7] Only emit unique classes. --- src/main/shadow/css/build.cljc | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/main/shadow/css/build.cljc b/src/main/shadow/css/build.cljc index 14802ef..eb91858 100644 --- a/src/main/shadow/css/build.cljc +++ b/src/main/shadow/css/build.cljc @@ -91,11 +91,15 @@ (emitln w " " (name prop) ": " (get group-rules prop) ";")) (emitln w "}"))) -(defn emit-def [w {:keys [sel rules at-rules ns line column rules] :as def}] - ;; (emitln w (str "/* " ns " " line ":" column " */")) +(defn emit-meta-comment [w rules] + (emitln w (str "/*\n" + (str/join "\n" + (for [{:keys [ns line column]} rules] + (str ns " " line ":" column ))) + "\n*/"))) +(defn emit-def [w {:keys [sel rules at-rules ns line column rules] :as def}] (emit-rule w sel rules) - (doseq [[media-query rules] at-rules] (emitln w media-query "{") (emit-rule w sel rules) @@ -114,8 +118,10 @@ [(doseq [inc classpath-includes] (emitln sw (slurp (io/resource inc))))]) - (doseq [def rules] - (emit-def sw def)) + (doseq [[_ def-rules] (group-by :css-id rules)] + (emit-meta-comment sw def-rules) + (emit-def sw (first def-rules))) + (.toString sw)))))) (defn collect-namespaces-for-chunk From 82ed5960f5df80268b4ea41d6be3a5dd76a89527 Mon Sep 17 00:00:00 2001 From: Phil Jackson Date: Sat, 21 Oct 2023 19:42:55 +0100 Subject: [PATCH 4/7] Comments. --- src/main/shadow/css/build.cljc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/shadow/css/build.cljc b/src/main/shadow/css/build.cljc index eb91858..50345eb 100644 --- a/src/main/shadow/css/build.cljc +++ b/src/main/shadow/css/build.cljc @@ -91,7 +91,7 @@ (emitln w " " (name prop) ": " (get group-rules prop) ";")) (emitln w "}"))) -(defn emit-meta-comment [w rules] +(defn emit-meta-comments [w rules] (emitln w (str "/*\n" (str/join "\n" (for [{:keys [ns line column]} rules] @@ -119,7 +119,9 @@ (emitln sw (slurp (io/resource inc))))]) (doseq [[_ def-rules] (group-by :css-id rules)] - (emit-meta-comment sw def-rules) + ;; emit comments for all of the rules + (emit-meta-comments sw def-rules) + ;; but we only need to emit the first actual def (emit-def sw (first def-rules))) (.toString sw)))))) @@ -505,4 +507,4 @@ (load-colors-from-classpath) (load-indexes-from-classpath) (generate-color-aliases) - (generate-spacing-aliases)))))) \ No newline at end of file + (generate-spacing-aliases)))))) From 487c42dbb9f0f9385a435c91c8360ced4abdb881 Mon Sep 17 00:00:00 2001 From: Phil Jackson Date: Sat, 21 Oct 2023 20:14:37 +0100 Subject: [PATCH 5/7] Tests. --- src/test/shadow/css/specs_test.cljc | 33 +++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 src/test/shadow/css/specs_test.cljc diff --git a/src/test/shadow/css/specs_test.cljc b/src/test/shadow/css/specs_test.cljc new file mode 100644 index 0000000..68d601d --- /dev/null +++ b/src/test/shadow/css/specs_test.cljc @@ -0,0 +1,33 @@ +(ns shadow.css.specs-test + (:require + [clojure.test :refer [deftest is testing]] + [shadow.css.specs :as specs])) + +(deftest generate-id-test + (testing "Complex ID" + (is (= "sc--1789522625" + (specs/generate-id [:px-4 :my-2 + "pass" + :c-text-1 + [:&hover :py-10] + [:md+ :px-6 + ["@media print" :px-2]] + [:lg+ :px-8 + [:&hover :py-12]]])))) + + (testing "Order of rules" + (testing "doesn't matter within selectors/main list" + (is (= (specs/generate-id [:px-4 :my-2 + [:&hover :m-4 :py-10 :px-4] + [:lg+ :px-8 + [:&hover :p-4 :py-12]]]) + (specs/generate-id [:px-4 :my-2 + [:&hover :py-10 :m-4 :px-4] + [:lg+ :px-8 + [:&hover :py-12 :p-4]]])))) + + (testing "does matter for the whole structure" + (is (not= (specs/generate-id [:m-4 + [:&hover :px-4]]) + (specs/generate-id [:px-4 + [:&hover :m-4]])))))) From efa6057f35a954966d08cfbeb082a0bb66858eb5 Mon Sep 17 00:00:00 2001 From: Phil Jackson Date: Sat, 21 Oct 2023 20:15:57 +0100 Subject: [PATCH 6/7] Better doc string. --- src/main/shadow/css/specs.cljc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/shadow/css/specs.cljc b/src/main/shadow/css/specs.cljc index c5890f1..fa1c5c1 100644 --- a/src/main/shadow/css/specs.cljc +++ b/src/main/shadow/css/specs.cljc @@ -96,8 +96,8 @@ conformed))) (defn generate-id - "Generates a class name which is unique given the contents. Please have a look - at the tests for more information." + "Generates a class name which is unique given the contents. Will account for + different ordering within the subqueries." [rules] (str "sc-" (postwalk (fn [rule] From 43f3622d8f63503bb4a71b019b2beac1eb1f488d Mon Sep 17 00:00:00 2001 From: Phil Jackson Date: Sat, 21 Oct 2023 20:18:26 +0100 Subject: [PATCH 7/7] Doc string on comments fn. --- src/main/shadow/css/build.cljc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/shadow/css/build.cljc b/src/main/shadow/css/build.cljc index 50345eb..75f5052 100644 --- a/src/main/shadow/css/build.cljc +++ b/src/main/shadow/css/build.cljc @@ -91,7 +91,10 @@ (emitln w " " (name prop) ": " (get group-rules prop) ";")) (emitln w "}"))) -(defn emit-meta-comments [w rules] +(defn emit-meta-comments + "Within a single comment, output a list of namespaces, line and column numbers + for a given set of rules." + [w rules] (emitln w (str "/*\n" (str/join "\n" (for [{:keys [ns line column]} rules]