🐛 Fix inconsistencies on parsing tokens dtcg json

This commit is contained in:
Andrey Antukh 2025-03-20 16:15:17 +01:00 committed by Andrés Moya
parent c6bfae0d63
commit e8e9037ef1

View file

@ -799,7 +799,7 @@
(map-indexed (fn [index item] (map-indexed (fn [index item]
(assoc item :index index)))))) (assoc item :index index))))))
(defn flatten-nested-tokens-json (defn- flatten-nested-tokens-json
"Recursively flatten the dtcg token structure, joining keys with '.'." "Recursively flatten the dtcg token structure, joining keys with '.'."
[tokens token-path] [tokens token-path]
(reduce-kv (reduce-kv
@ -1290,56 +1290,85 @@ Will return a value that matches this schema:
(assoc-in ["$metadata" "activeThemes"] active-themes-clear) (assoc-in ["$metadata" "activeThemes"] active-themes-clear)
(assoc-in ["$metadata" "activeSets"] active-sets)))) (assoc-in ["$metadata" "activeSets"] active-sets))))
(decode-dtcg-json [_ parsed-json] (decode-dtcg-json [_ data]
(let [metadata (get parsed-json "$metadata") (assert (map? data) "expected a map data structure for `data`")
sets-data (dissoc parsed-json "$themes" "$metadata")
themes-data (->> (get parsed-json "$themes")
(map (fn [theme]
(-> theme
(set/rename-keys {"selectedTokenSets" "sets"})
(update "sets" keys)
(update "sets" #(map normalize-set-name %))))))
active-sets (get metadata "activeSets") (let [metadata (get data "$metadata")
active-themes (get metadata "activeThemes")
active-themes (if (empty? active-themes)
#{hidden-token-theme-path}
active-themes)
set-order (get metadata "tokenSetOrder") xf-normalize-set-name
name->pos (into {} (map-indexed (fn [idx itm] [itm idx]) set-order)) (map normalize-set-name)
sets-data' (sort-by (comp name->pos first) sets-data)
lib (make-tokens-lib) sets
lib' (->> sets-data' (dissoc data "$themes" "$metadata")
(reduce (fn [lib [set-name tokens]]
(add-set lib (make-token-set ordered-sets
:name set-name (-> (d/ordered-set)
:tokens (flatten-nested-tokens-json tokens "")))) (into xf-normalize-set-name (get metadata "tokenSetOrder"))
lib)) (into xf-normalize-set-name (keys sets)))
lib' (cond-> lib'
(and (seq active-sets) (= #{hidden-token-theme-path} active-themes)) active-sets
(update-theme hidden-token-theme-group hidden-token-theme-name (or (->> (get metadata "activeSets")
#(assoc % :sets active-sets)))] (into #{} xf-normalize-set-name)
(if-let [themes-data (seq themes-data)] (not-empty))
(as-> lib' $ #{})
(reduce
(fn [lib {:strs [name group description is-source id modified-at sets]}] active-themes
(add-theme lib (TokenTheme. name (or (->> (get metadata "activeThemes")
(or group "") (into #{})
description (not-empty))
(some? is-source) #{hidden-token-theme-path})
(or id (str (uuid/next)))
(or (some-> modified-at themes
(dt/parse-instant)) (->> (get data "$themes")
(dt/now)) (map (fn [theme]
(set sets)))) (make-token-theme
$ themes-data) :name (get theme "name")
(reduce :group (get theme "group")
(fn [lib active-theme] :is-source (get theme "is-source")
(let [[group name] (split-token-theme-path active-theme)] :id (get theme "id")
(activate-theme lib group name))) :modified-at (some-> (get theme "modified-at")
$ active-themes)) (dt/parse-instant))
lib'))) :sets (into #{}
(comp (map key)
xf-normalize-set-name
(filter #(contains? ordered-sets %)))
(get theme "selectedTokenSets")))))
(not-empty))
library
(make-tokens-lib)
sets
(reduce-kv (fn [result name tokens]
(assoc result
(normalize-set-name name)
(flatten-nested-tokens-json tokens "")))
{}
sets)
library
(reduce (fn [library name]
(if-let [tokens (get sets name)]
(add-set library (make-token-set :name name :tokens tokens))
library))
library
ordered-sets)
library
(update-theme library hidden-token-theme-group hidden-token-theme-name
#(assoc % :sets active-sets))
library
(reduce add-theme library themes)
library
(reduce (fn [library theme-path]
(let [[group name] (split-token-theme-path theme-path)]
(activate-theme library group name)))
library
active-themes)]
library))
(decode-legacy-json [this parsed-legacy-json] (decode-legacy-json [this parsed-legacy-json]
(let [other-data (select-keys parsed-legacy-json ["$themes" "$metadata"]) (let [other-data (select-keys parsed-legacy-json ["$themes" "$metadata"])