From becd0d9cbffdd130e068dba4ceeabaff5853ccfc Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Fri, 27 Nov 2020 16:08:45 +0100 Subject: [PATCH] :bug: Add strict spec verify on operations result. --- common/app/common/pages.cljc | 50 ++++++++++++++++++++++++------------ common/app/common/spec.cljc | 15 +++++++++++ 2 files changed, 49 insertions(+), 16 deletions(-) diff --git a/common/app/common/pages.cljc b/common/app/common/pages.cljc index 8e2c58bb2..971cf9296 100644 --- a/common/app/common/pages.cljc +++ b/common/app/common/pages.cljc @@ -44,18 +44,33 @@ (s/def ::component-root? boolean?) (s/def ::shape-ref uuid?) -(s/def ::safe-integer - #(and - (integer? %) - (>= % min-safe-int) - (<= % max-safe-int))) +(s/def ::safe-integer ::us/safe-integer) +(s/def ::safe-number ::us/safe-number) -(s/def ::safe-number - #(and - (number? %) - (>= % min-safe-int) - (<= % max-safe-int))) +(s/def :internal.matrix/a ::us/safe-number) +(s/def :internal.matrix/b ::us/safe-number) +(s/def :internal.matrix/c ::us/safe-number) +(s/def :internal.matrix/d ::us/safe-number) +(s/def :internal.matrix/e ::us/safe-number) +(s/def :internal.matrix/f ::us/safe-number) +(s/def ::matrix + (s/and (s/keys :req-un [:internal.matrix/a + :internal.matrix/b + :internal.matrix/c + :internal.matrix/d + :internal.matrix/e + :internal.matrix/f]) + gmt/matrix?)) + + +(s/def :internal.point/x ::us/safe-number) +(s/def :internal.point/y ::us/safe-number) + +(s/def ::point + (s/and (s/keys :req-un [:internal.point/x + :internal.point/y]) + gpt/point?)) ;; GRADIENTS @@ -252,7 +267,6 @@ (s/def :internal.shape/exports (s/coll-of :internal.shape/export :kind vector?)) - (s/def :internal.shape/selrect (s/keys :req-un [:internal.shape/x :internal.shape/y @@ -263,15 +277,15 @@ :internal.shape/width :internal.shape/height])) -(s/def :internal.shape/point - (s/and (s/keys :req-un [:internal.shape/x :internal.shape/y]) gpt/point?)) - (s/def :internal.shape/points - (s/every :internal.shape/point :kind vector?)) + (s/every ::point :kind vector?)) (s/def :internal.shape/shapes (s/every uuid? :kind vector?)) +(s/def :internal.shape/transform ::matrix) +(s/def :internal.shape/transform-inverse ::matrix) + (s/def ::shape-attrs (s/keys :opt-un [:internal.shape/selrect :internal.shape/points @@ -306,6 +320,8 @@ :internal.shape/stroke-width :internal.shape/stroke-alignment :internal.shape/text-align + :internal.shape/transform + :internal.shape/transform-inverse :internal.shape/width :internal.shape/height :internal.shape/interactions @@ -781,7 +797,9 @@ [data {:keys [id page-id component-id operations] :as change}] (let [update-fn (fn [objects] (if-let [obj (get objects id)] - (assoc objects id (reduce process-operation obj operations)) + (let [result (reduce process-operation obj operations)] + (us/verify ::shape result) + (assoc objects id result)) objects))] (if page-id (d/update-in-when data [:pages-index page-id :objects] update-fn) diff --git a/common/app/common/spec.cljc b/common/app/common/spec.cljc index 4223c93f3..de5203536 100644 --- a/common/app/common/spec.cljc +++ b/common/app/common/spec.cljc @@ -121,6 +121,21 @@ (s/def ::point gpt/point?) (s/def ::id ::uuid) +(def max-safe-int 9007199254740991) +(def min-safe-int -9007199254740991) + +(s/def ::safe-integer + #(and + (integer? %) + (>= % min-safe-int) + (<= % max-safe-int))) + +(s/def ::safe-number + #(and + (number? %) + (>= % min-safe-int) + (<= % max-safe-int))) + ;; --- Macros (defn spec-assert