From 1dcdddb2dbc9d0059b2c6297fd1eb451020c00c8 Mon Sep 17 00:00:00 2001 From: Florian Schroedl Date: Fri, 21 Jun 2024 17:00:45 +0200 Subject: [PATCH] Check for self references --- .../src/app/main/ui/workspace/tokens/form.cljs | 14 ++++++++------ .../ui/workspace/tokens/style_dictionary.cljs | 15 +++++++++++++++ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/frontend/src/app/main/ui/workspace/tokens/form.cljs b/frontend/src/app/main/ui/workspace/tokens/form.cljs index ba0abee6e7..0e71f6d04c 100644 --- a/frontend/src/app/main/ui/workspace/tokens/form.cljs +++ b/frontend/src/app/main/ui/workspace/tokens/form.cljs @@ -82,13 +82,15 @@ ;; Value value (mf/use-var (or (:value token) "")) - resolved-value (mf/use-state (get-in tokens [(:id token) :resolved-value])) + token-resolve-result (mf/use-state (get-in tokens [(:id token) :resolved-value])) set-resolve-value (mf/use-callback - (fn [token] - (when (:resolved-value token) - (reset! resolved-value (:resolved-value token))))) - value-errors (mf/use-state nil) - on-update-value (sd/use-debonced-resolve-callback tokens set-resolve-value)] + (fn [token-or-err] + (let [value (cond + (= token-or-err :error/token-self-reference) :error/token-self-reference + (= token-or-err :error/token-missing-reference) :error/token-missing-reference + (:resolved-value token-or-err) (:resolved-value token-or-err))] + (reset! token-resolve-result value)))) + on-update-value (sd/use-debonced-resolve-callback name token tokens set-resolve-value)] ;; on-submit (fn [e] ;; (dom/prevent-default e) diff --git a/frontend/src/app/main/ui/workspace/tokens/style_dictionary.cljs b/frontend/src/app/main/ui/workspace/tokens/style_dictionary.cljs index 9155b2c0b2..bc34925c59 100644 --- a/frontend/src/app/main/ui/workspace/tokens/style_dictionary.cljs +++ b/frontend/src/app/main/ui/workspace/tokens/style_dictionary.cljs @@ -23,6 +23,21 @@ ;; Functions ------------------------------------------------------------------- +(defn token-self-reference? [token-name reference-string] + (let [escaped-name (str/replace token-name "." "\\.") + regex (-> (str "{" escaped-name "}") + (re-pattern))] + (re-find regex reference-string))) + +(comment + (token-self-reference? {:name "some.value"} "{md} + {some.value}") + (token-self-reference? {:name "some.value"} "some.value") + (token-self-reference? {:name "some.value"} "{some|value}") + (token-self-reference? {:name "sm"} "{md} + {lg}") + (token-self-reference? {:name "sm"} "1") + (token-self-reference? {:name ""} "121") + nil) + (defn tokens->style-dictionary+ "Resolves references and math expressions using StyleDictionary. Returns a promise with the resolved dictionary."