mirror of
https://github.com/penpot/penpot.git
synced 2026-06-16 04:12:03 +00:00
WIP
This commit is contained in:
parent
9655a2680c
commit
c8f46408bc
@ -1805,6 +1805,12 @@
|
||||
{})]
|
||||
(cfcp/sync-component-id-with-ref-shape data libraries)))
|
||||
|
||||
|
||||
(defmethod migrate-data "0021-dummy"
|
||||
[data _]
|
||||
data)
|
||||
|
||||
|
||||
(def available-migrations
|
||||
(into (d/ordered-set)
|
||||
["legacy-2"
|
||||
@ -1882,4 +1888,5 @@
|
||||
"0017-fix-layout-flex-dir"
|
||||
"0018-remove-unneeded-objects-from-components"
|
||||
"0019-fix-missing-swap-slots"
|
||||
"0020-sync-component-id-with-near-main"]))
|
||||
"0020-sync-component-id-with-near-main"
|
||||
"0021-dummy"))
|
||||
|
||||
@ -12,6 +12,7 @@
|
||||
clojure.lang.Ratio
|
||||
java.io.ByteArrayInputStream
|
||||
java.io.ByteArrayOutputStream
|
||||
java.lang.reflect.Method
|
||||
java.time.Instant
|
||||
java.time.OffsetDateTime
|
||||
java.util.List
|
||||
@ -125,11 +126,33 @@
|
||||
(write [_ w o]
|
||||
(wfn name w o)))}])
|
||||
|
||||
|
||||
(defn- get-max-arity
|
||||
[^Object f]
|
||||
(let [^Class cls (.getClass f)
|
||||
methods (.getDeclaredMethods cls)]
|
||||
(->> methods
|
||||
(filter #(= "invoke" (.getName ^Method %)))
|
||||
(map #(.getParameterCount ^Method %))
|
||||
(map long)
|
||||
(reduce max 0))))
|
||||
|
||||
(defn- adapt-read-handler
|
||||
[{:keys [name rfn]}]
|
||||
[name (reify ReadHandler
|
||||
(read [_ rdr _ _]
|
||||
(rfn rdr)))])
|
||||
(let [arity (get-max-arity rfn)]
|
||||
(case (long arity)
|
||||
3
|
||||
(do
|
||||
[name (reify ReadHandler
|
||||
(read [_ rdr tag n]
|
||||
(prn "AAAAAAAA" tag rfn)
|
||||
(rfn rdr tag n)))])
|
||||
|
||||
|
||||
1
|
||||
[name (reify ReadHandler
|
||||
(read [_ rdr _ _]
|
||||
(rfn rdr)))])))
|
||||
|
||||
(defn- merge-handlers
|
||||
[m1 m2]
|
||||
@ -294,12 +317,14 @@
|
||||
{:name "clj/set"
|
||||
:class clojure.lang.IPersistentSet
|
||||
:wfn write-list-like
|
||||
:rfn (comp set read-object!)}
|
||||
:rfn (fn [r]
|
||||
(-> r read-object! set))}
|
||||
|
||||
{:name "clj/vector"
|
||||
:class clojure.lang.IPersistentVector
|
||||
:wfn write-list-like
|
||||
:rfn (comp vec read-object!)}
|
||||
:rfn (fn [r]
|
||||
(-> r read-object! vec))}
|
||||
|
||||
{:name "clj/list"
|
||||
;; :class clojure.lang.IPersistentList
|
||||
@ -309,12 +334,13 @@
|
||||
{:name "clj/seq"
|
||||
:class clojure.lang.ISeq
|
||||
:wfn write-list-like
|
||||
:rfn (comp sequence read-object!)}
|
||||
:rfn (fn [r] (-> r read-object! sequence))}
|
||||
|
||||
{:name "linked/set"
|
||||
:class LinkedSet
|
||||
:wfn write-list-like
|
||||
:rfn (comp #(into (d/ordered-set) %) read-object!)})
|
||||
:rfn (fn [r]
|
||||
(->> r read-object! (into (d/ordered-set))))})
|
||||
|
||||
;; --- PUBLIC API
|
||||
|
||||
|
||||
@ -27,7 +27,7 @@
|
||||
{:name "penpot/geom/rect"
|
||||
:class Rect
|
||||
:wfn fres/write-map-like
|
||||
:rfn (comp map->Rect fres/read-map-like)}))
|
||||
:rfn (fn [r] (-> r fres/read-map-like map->Rect))}))
|
||||
|
||||
(t/add-handlers!
|
||||
{:id "rect"
|
||||
|
||||
@ -639,7 +639,8 @@
|
||||
{:name "penpot/shape"
|
||||
:class Shape
|
||||
:wfn fres/write-map-like
|
||||
:rfn (comp map->Shape fres/read-map-like)}))
|
||||
:rfn (fn [r]
|
||||
(-> r fres/read-map-like map->Shape))}))
|
||||
|
||||
;; --- SHAPE COPY/PASTE PROPS
|
||||
|
||||
|
||||
@ -947,13 +947,25 @@ Will return a value that matches this schema:
|
||||
(declare read-multi-set-dtcg)
|
||||
(declare export-dtcg-json)
|
||||
|
||||
(deftype TokensLib [sets themes active-themes]
|
||||
(deftype TokensLib [sets themes active-themes metadata]
|
||||
;; This is to convert the TokensLib to a plain map, for debugging or unit tests.
|
||||
cp/Datafiable
|
||||
(datafy [_]
|
||||
{:sets sets
|
||||
:themes themes
|
||||
:active-themes active-themes})
|
||||
:active-themes active-themes
|
||||
:metadata metadata})
|
||||
|
||||
#?@(:cljs
|
||||
[cljs.core/IWithMeta
|
||||
(-with-meta [_o meta] (TokensLib. sets themes active-themes meta))
|
||||
cljs.core/IMeta
|
||||
(-meta [_o] metadata)]
|
||||
|
||||
:clj
|
||||
[clojure.lang.IObj
|
||||
(withMeta [_o meta] (TokensLib. sets themes active-themes meta))
|
||||
(meta [_o] metadata)])
|
||||
|
||||
#?@(:clj
|
||||
[c.json/JSONWriter
|
||||
@ -978,7 +990,8 @@ Will return a value that matches this schema:
|
||||
(let [path (get-set-prefixed-path token-set)]
|
||||
(TokensLib. (d/oassoc-in sets path token-set)
|
||||
themes
|
||||
active-themes)))
|
||||
active-themes
|
||||
metadata)))
|
||||
|
||||
(update-set [this id f]
|
||||
(assert (uuid? id) "expected uuid for `id`")
|
||||
@ -992,7 +1005,8 @@ Will return a value that matches this schema:
|
||||
(if (= name name')
|
||||
(TokensLib. (d/oassoc-in sets prefixed-full-path set')
|
||||
themes
|
||||
active-themes)
|
||||
active-themes
|
||||
metadata)
|
||||
(TokensLib. (-> sets
|
||||
(d/oassoc-in-before prefixed-full-path prefixed-full-path' set')
|
||||
(d/dissoc-in prefixed-full-path))
|
||||
@ -1002,7 +1016,8 @@ Will return a value that matches this schema:
|
||||
(update-set-name form name name')
|
||||
form))
|
||||
themes)
|
||||
active-themes)))
|
||||
active-themes
|
||||
metadata)))
|
||||
this)))
|
||||
|
||||
(delete-set [this id]
|
||||
@ -1017,7 +1032,8 @@ Will return a value that matches this schema:
|
||||
(disable-set form set-name)
|
||||
form))
|
||||
themes)
|
||||
active-themes)))
|
||||
active-themes
|
||||
metadata)))
|
||||
|
||||
(move-set [_ from-path to-path before-path before-group?]
|
||||
(let [prefixed-from-path (set-full-path->set-prefixed-full-path from-path)
|
||||
@ -1059,8 +1075,9 @@ Will return a value that matches this schema:
|
||||
(update-set-name form (get-name prev-set) (get-name set))
|
||||
form))
|
||||
themes))
|
||||
active-themes))
|
||||
(TokensLib. sets themes active-themes))))
|
||||
active-themes
|
||||
metadata))
|
||||
(TokensLib. sets themes active-themes metadata))))
|
||||
|
||||
(move-set-group [this from-path to-path before-path before-group?]
|
||||
(let [prefixed-from-path (set-group-path->set-group-prefixed-path from-path)
|
||||
@ -1104,10 +1121,8 @@ Will return a value that matches this schema:
|
||||
(update form :sets #(set (replace rename-sets-map %)))
|
||||
form))
|
||||
themes)))]
|
||||
(TokensLib. sets'
|
||||
themes'
|
||||
active-themes))
|
||||
(TokensLib. sets themes active-themes))))
|
||||
(TokensLib. sets' themes' active-themes metadata))
|
||||
(TokensLib. sets themes active-themes metadata))))
|
||||
|
||||
(get-set-tree [_]
|
||||
sets)
|
||||
@ -1154,7 +1169,8 @@ Will return a value that matches this schema:
|
||||
(let [token-theme (check-token-theme token-theme)]
|
||||
(TokensLib. sets
|
||||
(update themes (:group token-theme) d/oassoc (:name token-theme) token-theme)
|
||||
active-themes)))
|
||||
active-themes
|
||||
metadata)))
|
||||
|
||||
(update-theme [this id f]
|
||||
(if-let [theme (get-theme this id)]
|
||||
@ -1177,7 +1193,8 @@ Will return a value that matches this schema:
|
||||
(d/dissoc-in [group name])))
|
||||
(if same-path?
|
||||
active-themes
|
||||
(disj active-themes (join-theme-path group name)))))))
|
||||
(disj active-themes (join-theme-path group name)))
|
||||
metadata))))
|
||||
this))
|
||||
|
||||
(delete-theme [this id]
|
||||
@ -1186,7 +1203,8 @@ Will return a value that matches this schema:
|
||||
(if theme
|
||||
(TokensLib. sets
|
||||
(d/dissoc-in themes [group name])
|
||||
(disj active-themes (join-theme-path group name)))
|
||||
(disj active-themes (join-theme-path group name))
|
||||
metadata)
|
||||
this)))
|
||||
|
||||
(get-theme-tree [_]
|
||||
@ -1215,7 +1233,8 @@ Will return a value that matches this schema:
|
||||
(set-active-themes [_ active-themes]
|
||||
(TokensLib. sets
|
||||
themes
|
||||
active-themes))
|
||||
active-themes
|
||||
metadata))
|
||||
|
||||
(activate-theme [this id]
|
||||
(if-let [theme (get-theme this id)]
|
||||
@ -1227,14 +1246,16 @@ Will return a value that matches this schema:
|
||||
(conj (get-theme-path theme)))]
|
||||
(TokensLib. sets
|
||||
themes
|
||||
active-themes'))
|
||||
active-themes'
|
||||
metadata))
|
||||
this))
|
||||
|
||||
(deactivate-theme [this id]
|
||||
(if-let [theme (get-theme this id)]
|
||||
(TokensLib. sets
|
||||
themes
|
||||
(disj active-themes (get-theme-path theme)))
|
||||
(disj active-themes (get-theme-path theme))
|
||||
metadata)
|
||||
this))
|
||||
|
||||
(theme-active? [this id]
|
||||
@ -1297,7 +1318,8 @@ Will return a value that matches this schema:
|
||||
(TokensLib. sets
|
||||
(d/oupdate-in themes [(:group theme) (:name theme)]
|
||||
#(toggle-set % set-name))
|
||||
active-themes)
|
||||
active-themes
|
||||
metadata)
|
||||
this))
|
||||
|
||||
(get-active-themes-set-names [this]
|
||||
@ -1438,8 +1460,8 @@ Will return a value that matches this schema:
|
||||
"Make a new instance of TokensLib from a map, but skiping all
|
||||
validation; it is used for create new instances from trusted
|
||||
sources"
|
||||
[& {:keys [sets themes active-themes]}]
|
||||
(TokensLib. sets themes active-themes))
|
||||
[& {:keys [sets themes active-themes metadata]}]
|
||||
(TokensLib. sets themes active-themes metadata))
|
||||
|
||||
(defn make-tokens-lib
|
||||
"Make a new instance of TokensLib from a map and validates the input"
|
||||
@ -1552,7 +1574,7 @@ Will return a value that matches this schema:
|
||||
current-path: the path of the group being renamed, e.g. \"foo.bar\"
|
||||
current-name: the current name of the group being renamed, e.g. \"bar\"
|
||||
new-name: the new name for the group being renamed, e.g. \"baz\"
|
||||
|
||||
|
||||
Returns a sequence of [name token] for each renamed token."
|
||||
|
||||
[active-tokens current-path current-name new-name]
|
||||
@ -2413,36 +2435,53 @@ Will return a value that matches this schema:
|
||||
(fix-conflicting-token-names)
|
||||
(fix-missing-sets-in-themes)))))
|
||||
|
||||
#?(:clj
|
||||
(defn- read-tokens-lib-v1-4
|
||||
"Reads the tokens lib data structure and fix conflicting token names."
|
||||
[r]
|
||||
(let [sets (fres/read-object! r)
|
||||
themes (fres/read-object! r)
|
||||
active-themes (fres/read-object! r)]
|
||||
;; #?(:clj
|
||||
;; (defn- read-tokens-lib-v1-4
|
||||
;; "Reads the tokens lib data structure and fix conflicting token names."
|
||||
;; [r]
|
||||
;; (let [sets (fres/read-object! r)
|
||||
;; themes (fres/read-object! r)
|
||||
;; active-themes (fres/read-object! r)]
|
||||
|
||||
(-> {:sets sets
|
||||
:themes themes
|
||||
:active-themes active-themes}
|
||||
(map->tokens-lib)
|
||||
(fix-conflicting-token-names)
|
||||
(fix-missing-sets-in-themes)))))
|
||||
;; (-> {:sets sets
|
||||
;; :themes themes
|
||||
;; :active-themes active-themes}
|
||||
;; (map->tokens-lib)
|
||||
;; (fix-conflicting-token-names)
|
||||
;; (fix-missing-sets-in-themes)))))
|
||||
|
||||
#?(:clj
|
||||
(defn- write-tokens-lib
|
||||
[n w ^TokensLib o]
|
||||
(fres/write-tag! w n 3)
|
||||
(fres/write-tag! w n 4)
|
||||
(fres/write-object! w (.-sets o))
|
||||
(fres/write-object! w (.-themes o))
|
||||
(fres/write-object! w (.-active-themes o))))
|
||||
(fres/write-object! w (.-active-themes o))
|
||||
(fres/write-object! w (.-metadata o))))
|
||||
|
||||
#?(:clj
|
||||
(defn- apply-internal-migration
|
||||
"A helper for conditionally apply internal migrations to the tokens
|
||||
data structure."
|
||||
[instance migration-name migration-fn]
|
||||
(let [migrations (-> instance meta :migrations)]
|
||||
(if (contains? migrations migration-name)
|
||||
instance
|
||||
(-> instance
|
||||
(migration-fn)
|
||||
(vary-meta update :migrations (fnil conj #{}) migration-name))))))
|
||||
|
||||
#?(:clj
|
||||
(defn- read-tokens-lib
|
||||
[r]
|
||||
[r _ n]
|
||||
(let [sets (fres/read-object! r)
|
||||
themes (fres/read-object! r)
|
||||
active-themes (fres/read-object! r)]
|
||||
(->TokensLib sets themes active-themes))))
|
||||
active-themes (fres/read-object! r)
|
||||
metadata (when (= n 4)
|
||||
(fres/read-object! r))]
|
||||
(-> (->TokensLib sets themes active-themes metadata)
|
||||
(apply-internal-migration "conflicting-token-names" fix-conflicting-token-names)
|
||||
(apply-internal-migration "fix-missing-sets-in-themes" fix-missing-sets-in-themes)))))
|
||||
|
||||
#?(:clj
|
||||
(fres/add-handlers!
|
||||
@ -2487,11 +2526,8 @@ Will return a value that matches this schema:
|
||||
{:name "penpot/tokens-lib/v1.3"
|
||||
:rfn read-tokens-lib-v1-3}
|
||||
|
||||
{:name "penpot/tokens-lib/v1.4"
|
||||
:rfn read-tokens-lib-v1-4}
|
||||
|
||||
;; CURRENT TOKENS LIB READER & WRITTER
|
||||
{:name "penpot/tokens-lib/v1.5"
|
||||
{:name "penpot/tokens-lib/v1.4"
|
||||
:class TokensLib
|
||||
:wfn write-tokens-lib
|
||||
:rfn read-tokens-lib}))
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user