diff --git a/CHANGES.md b/CHANGES.md index 62f13c132f..3d2938f6e2 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -6,7 +6,10 @@ ### :boom: Breaking changes & Deprecations -- Use [nginx-unprivileged](https://hub.docker.com/r/nginxinc/nginx-unprivileged) as base image for Penpot's frontend docker image. Now all the docker images runs with the same unprivileged user (penpot). Because of that, the default NGINX listen port now is 8080, instead of 80, so you will have to modify your infrastructure to apply this change. +- Use [nginx-unprivileged](https://hub.docker.com/r/nginxinc/nginx-unprivileged) as base image for + Penpot's frontend docker image. Now all the docker images runs with the same unprivileged user + (penpot). Because of that, the default NGINX listen port now is 8080, instead of 80, so you will + have to modify your infrastructure to apply this change. ### :heart: Community contributions (Thank you!) @@ -17,6 +20,14 @@ ### :bug: Bugs fixed +## 2.3.1 + +### :bug: Bugs fixed + +- Fix unexpected issue on interaction between plugins sandbox and + internal impl of promise + + ## 2.3.0 ### :rocket: Epics and highlights diff --git a/backend/src/app/rpc/commands/files.clj b/backend/src/app/rpc/commands/files.clj index 4856d57148..b129ccd768 100644 --- a/backend/src/app/rpc/commands/files.clj +++ b/backend/src/app/rpc/commands/files.clj @@ -374,7 +374,7 @@ f.revn, f.vern, f.is_shared, - ft.media_id + ft.media_id AS thumbnail_id from file as f left join file_thumbnail as ft on (ft.file_id = f.id and ft.revn = f.revn @@ -385,13 +385,7 @@ (defn get-project-files [conn project-id] - (->> (db/exec! conn [sql:project-files project-id]) - (mapv (fn [row] - (if-let [media-id (:media-id row)] - (-> row - (dissoc :media-id) - (assoc :thumbnail-uri (resolve-public-uri media-id))) - (dissoc row :media-id)))))) + (db/exec! conn [sql:project-files project-id])) (def schema:get-project-files [:map {:title "get-project-files"} diff --git a/common/src/app/common/files/changes.cljc b/common/src/app/common/files/changes.cljc index 3c097b5d0c..1ff501f345 100644 --- a/common/src/app/common/files/changes.cljc +++ b/common/src/app/common/files/changes.cljc @@ -467,7 +467,7 @@ #?(:clj (validate-shapes! data result items)) result)))) -;; DEPRECATED: remove before 2.3 release +;; DEPRECATED: remove after 2.3 release (defmethod process-change :set-option [data _] data) diff --git a/common/src/app/common/files/defaults.cljc b/common/src/app/common/files/defaults.cljc index 7628d9469e..21a8f304f3 100644 --- a/common/src/app/common/files/defaults.cljc +++ b/common/src/app/common/files/defaults.cljc @@ -6,4 +6,4 @@ (ns app.common.files.defaults) -(def version 56) +(def version 57) diff --git a/common/src/app/common/files/migrations.cljc b/common/src/app/common/files/migrations.cljc index fb5cb0076b..f6245b13b1 100644 --- a/common/src/app/common/files/migrations.cljc +++ b/common/src/app/common/files/migrations.cljc @@ -13,6 +13,7 @@ [app.common.files.defaults :as cfd] [app.common.files.helpers :as cfh] [app.common.geom.matrix :as gmt] + [app.common.geom.point :as gpt] [app.common.geom.rect :as grc] [app.common.geom.shapes :as gsh] [app.common.geom.shapes.path :as gsp] @@ -1102,6 +1103,33 @@ (update :pages-index update-vals update-container) (update :components update-vals update-container)))) + +(defn migrate-up-57 + [data] + (letfn [(fix-thread-positions [positions] + (reduce-kv (fn [result id {:keys [position] :as data}] + (let [data (cond + (gpt/point? position) + data + + (and (map? position) + (gpt/valid-point-attrs? position)) + (assoc data :position (gpt/point position)) + + :else + (assoc data :position (gpt/point 0 0)))] + (assoc result id data))) + positions + positions)) + + (update-page [page] + (d/update-when page :comment-thread-positions fix-thread-positions))] + + (-> data + (update :pages (fn [pages] (into [] (remove nil?) pages))) + (update :pages-index dissoc nil) + (update :pages-index update-vals update-page)))) + (def migrations "A vector of all applicable migrations" [{:id 2 :migrate-up migrate-up-2} @@ -1149,4 +1177,6 @@ {:id 53 :migrate-up migrate-up-26} {:id 54 :migrate-up migrate-up-54} {:id 55 :migrate-up migrate-up-55} - {:id 56 :migrate-up migrate-up-56}]) + {:id 56 :migrate-up migrate-up-56} + {:id 57 :migrate-up migrate-up-57}]) + diff --git a/common/src/app/common/geom/point.cljc b/common/src/app/common/geom/point.cljc index 2ac57cdbc3..3e6a4c727f 100644 --- a/common/src/app/common/geom/point.cljc +++ b/common/src/app/common/geom/point.cljc @@ -56,6 +56,9 @@ [:x ::sm/safe-number] [:y ::sm/safe-number]]) +(def valid-point-attrs? + (sm/validator schema:point-attrs)) + (def valid-point? (sm/validator [:and [:fn point?] schema:point-attrs])) diff --git a/docs/scripts/build.sh b/docs/scripts/build similarity index 100% rename from docs/scripts/build.sh rename to docs/scripts/build diff --git a/frontend/package.json b/frontend/package.json index 1c2651729e..87e55798f8 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -40,6 +40,7 @@ "watch:app": "concurrently \"clojure -M:dev:shadow-cljs watch main worker\" \"yarn run watch:app:libs\"", "watch": "yarn run watch:app:assets", "watch:app:assets": "node ./scripts/watch.js", + "watch:app": "clojure -M:dev:shadow-cljs watch main", "watch:storybook": "concurrently \"clojure -M:dev:shadow-cljs watch storybook\" \"storybook dev -p 6006 --no-open\" \"yarn run watch:storybook:assets\"", "watch:storybook:assets": "node ./scripts/watch-storybook.js" }, diff --git a/frontend/src/app/main/data/workspace/shapes.cljs b/frontend/src/app/main/data/workspace/shapes.cljs index 734d0488c1..c489b07ddf 100644 --- a/frontend/src/app/main/data/workspace/shapes.cljs +++ b/frontend/src/app/main/data/workspace/shapes.cljs @@ -18,6 +18,7 @@ [app.common.types.shape-tree :as ctst] [app.main.data.changes :as dch] [app.main.data.comments :as dc] + [app.main.data.events :as ev] [app.main.data.workspace.edition :as dwe] [app.main.data.workspace.selection :as dws] [app.main.data.workspace.state-helpers :as wsh] @@ -129,7 +130,9 @@ (dwu/commit-undo-transaction undo-id)) (when (cfh/text-shape? shape) (->> (rx/of (dwe/start-edition-mode (:id shape))) - (rx/observe-on :async))))))))) + (rx/observe-on :async))) + (when (cfh/frame-shape? shape) + (rx/of (ptk/event ::ev/event {::ev/name "add-frame"}))))))))) (defn move-shapes-into-frame [frame-id shapes] diff --git a/frontend/src/app/plugins/api.cljs b/frontend/src/app/plugins/api.cljs index 0b4b7259d6..15dc990e4e 100644 --- a/frontend/src/app/plugins/api.cljs +++ b/frontend/src/app/plugins/api.cljs @@ -40,8 +40,7 @@ [app.plugins.viewport :as viewport] [app.util.code-gen :as cg] [app.util.object :as obj] - [beicon.v2.core :as rx] - [promesa.core :as p])) + [beicon.v2.core :as rx])) ;; ;; PLUGINS PUBLIC API - The plugins will able to access this functions @@ -174,7 +173,7 @@ :else (let [file-id (:current-file-id @st/state)] - (p/create + (js/Promise. (fn [resolve reject] (->> (dwm/upload-media-url name file-id url) (rx/take 1) @@ -184,7 +183,7 @@ (uploadMediaData [_ name data mime-type] (let [file-id (:current-file-id @st/state)] - (p/create + (js/Promise. (fn [resolve reject] (->> (dwm/process-blobs {:file-id file-id diff --git a/frontend/src/app/plugins/comments.cljs b/frontend/src/app/plugins/comments.cljs index ff3a331065..79f8e9c39a 100644 --- a/frontend/src/app/plugins/comments.cljs +++ b/frontend/src/app/plugins/comments.cljs @@ -19,13 +19,12 @@ [app.plugins.shape :as shape] [app.plugins.user :as user] [app.plugins.utils :as u] - [beicon.v2.core :as rx] - [promesa.core :as p])) + [beicon.v2.core :as rx])) (deftype CommentProxy [$plugin $file $page $thread $id] Object (remove [_] - (p/create + (js/Promise. (fn [resolve reject] (cond (not (r/check-permission $plugin "comment:write")) @@ -79,7 +78,7 @@ Object (findComments [_] - (p/create + (js/Promise. (fn [resolve reject] (cond (not (r/check-permission $plugin "comment:read")) @@ -106,7 +105,7 @@ (u/display-not-valid :reply "Not valid") :else - (p/create + (js/Promise. (fn [resolve reject] (->> (rp/cmd! :create-comment {:thread-id $id :content content}) (rx/subs! #(resolve (comment-proxy $plugin $file $page $id $users %)) reject)))))) @@ -121,9 +120,9 @@ (u/display-not-valid :remove "Cannot change content from another user's comments") :else - (p/create + (js/Promise. (fn [resolve] - (p/create + (js/Promise. (st/emit! (dc/delete-comment-thread-on-workspace {:id $id} #(resolve)))))))))) (defn comment-thread-proxy? [p] diff --git a/frontend/src/app/plugins/file.cljs b/frontend/src/app/plugins/file.cljs index b80fc2b3fa..3f777585bf 100644 --- a/frontend/src/app/plugins/file.cljs +++ b/frontend/src/app/plugins/file.cljs @@ -21,8 +21,7 @@ [app.plugins.utils :as u] [app.util.http :as http] [app.util.object :as obj] - [beicon.v2.core :as rx] - [promesa.core :as p])) + [beicon.v2.core :as rx])) (deftype FileProxy [$plugin $id] Object @@ -133,7 +132,7 @@ :binfile-v3 :binfile-v1) "zip" :legacy-zip)] - (p/create + (js/Promise. (fn [resolve reject] (->> (uw/ask-many! {:cmd :export-files diff --git a/frontend/src/app/plugins/library.cljs b/frontend/src/app/plugins/library.cljs index 31080c7205..bce7fa071d 100644 --- a/frontend/src/app/plugins/library.cljs +++ b/frontend/src/app/plugins/library.cljs @@ -30,8 +30,7 @@ [app.plugins.utils :as u] [app.util.object :as obj] [beicon.v2.core :as rx] - [potok.v2.core :as ptk] - [promesa.core :as p])) + [potok.v2.core :as ptk])) (declare lib-color-proxy) (declare lib-typography-proxy) @@ -915,7 +914,7 @@ (availableLibraries [_] (let [team-id (:current-team-id @st/state)] - (p/create + (js/Promise. (fn [resolve reject] (let [current-libs (into #{} (map first) (get @st/state :workspace-libraries))] (->> (rp/cmd! :get-team-shared-files {:team-id team-id}) @@ -939,7 +938,7 @@ (u/display-not-valid :connectLibrary "Plugin doesn't have 'library:write' permission") :else - (p/create + (js/Promise. (fn [resolve reject] (cond (not (string? library-id)) diff --git a/frontend/src/app/plugins/page.cljs b/frontend/src/app/plugins/page.cljs index 9160d739e1..a575ff742f 100644 --- a/frontend/src/app/plugins/page.cljs +++ b/frontend/src/app/plugins/page.cljs @@ -29,8 +29,7 @@ [app.plugins.utils :as u] [app.util.object :as obj] [beicon.v2.core :as rx] - [cuerdas.core :as str] - [promesa.core :as p])) + [cuerdas.core :as str])) (deftype FlowProxy [$plugin $file $page $id] Object @@ -288,7 +287,7 @@ (some? board) (-> (update :x - (:x board)) (update :y - (:y board))))] - (p/create + (js/Promise. (fn [resolve] (st/emit! (dc/create-thread-on-workspace @@ -315,10 +314,10 @@ (u/display-not-valid :removeCommentThread "Plugin doesn't have 'content:write' permission") :else - (p/create + (js/Promise. (fn [resolve] (let [thread-id (obj/get thread "$id")] - (p/create + (js/Promise. (st/emit! (dc/delete-comment-thread-on-workspace {:id thread-id} #(resolve))))))))) (findCommentThreads @@ -326,7 +325,7 @@ (let [only-yours (boolean (obj/get criteria "onlyYours" false)) show-resolved (boolean (obj/get criteria "showResolved" true)) user-id (-> @st/state :profile :id)] - (p/create + (js/Promise. (fn [resolve reject] (cond (not (r/check-permission $plugin "comment:read")) diff --git a/frontend/src/app/plugins/shape.cljs b/frontend/src/app/plugins/shape.cljs index c480b6b0a2..9097cd5b0c 100644 --- a/frontend/src/app/plugins/shape.cljs +++ b/frontend/src/app/plugins/shape.cljs @@ -52,8 +52,7 @@ [app.util.object :as obj] [app.util.path.format :as upf] [beicon.v2.core :as rx] - [cuerdas.core :as str] - [promesa.core :as p])) + [cuerdas.core :as str])) (declare shape-proxy) (declare shape-proxy?) @@ -542,7 +541,7 @@ :type (:type value :png) :suffix (:suffix value "") :scale (:scale value 1)}]}] - (p/create + (js/Promise. (fn [resolve reject] (->> (rp/cmd! :export payload) (rx/mapcat #(rp/cmd! :export {:cmd :get-resource :wait true :id (:id %) :blob? true})) @@ -952,7 +951,7 @@ ;; Geometry properties {:name "x" - :get #(-> % u/proxy->shape :x) + :get #(-> % u/proxy->shape :points grc/points->rect :x) :set (fn [self value] (let [id (obj/get self "$id")] @@ -967,7 +966,7 @@ (st/emit! (dw/update-position id {:x value})))))} {:name "y" - :get #(-> % u/proxy->shape :y) + :get #(-> % u/proxy->shape :points grc/points->rect :y) :set (fn [self value] (let [id (obj/get self "$id")] @@ -991,9 +990,10 @@ {:name "parentX" :get (fn [self] (let [shape (u/proxy->shape self) + shape-x (-> shape :points grc/points->rect :x) parent-id (:parent-id shape) parent (u/locate-shape (obj/get self "$file") (obj/get self "$page") parent-id)] - (- (:x shape) (:x parent)))) + (- shape-x (:x parent)))) :set (fn [self value] (cond @@ -1013,10 +1013,11 @@ {:name "parentY" :get (fn [self] (let [shape (u/proxy->shape self) + shape-y (-> shape :points grc/points->rect :y) parent-id (:parent-id shape) parent (u/locate-shape (obj/get self "$file") (obj/get self "$page") parent-id) parent-y (:y parent)] - (- (:y shape) parent-y))) + (- shape-y parent-y))) :set (fn [self value] (cond @@ -1036,10 +1037,11 @@ {:name "boardX" :get (fn [self] (let [shape (u/proxy->shape self) + shape-x (-> shape :points grc/points->rect :x) frame-id (:parent-id shape) frame (u/locate-shape (obj/get self "$file") (obj/get self "$page") frame-id) frame-x (:x frame)] - (- (:x shape) frame-x))) + (- shape-x frame-x))) :set (fn [self value] (cond @@ -1059,10 +1061,11 @@ {:name "boardY" :get (fn [self] (let [shape (u/proxy->shape self) + shape-y (-> shape :points grc/points->rect :y) frame-id (:parent-id shape) frame (u/locate-shape (obj/get self "$file") (obj/get self "$page") frame-id) frame-y (:y frame)] - (- (:y shape) frame-y))) + (- shape-y frame-y))) :set (fn [self value] (cond @@ -1080,10 +1083,10 @@ (st/emit! (dw/update-position id {:y (+ frame-y value)})))))} {:name "width" - :get #(-> % u/proxy->shape :width)} + :get #(-> % u/proxy->shape :selrect :width)} {:name "height" - :get #(-> % u/proxy->shape :height)} + :get #(-> % u/proxy->shape :selrect :height)} {:name "bounds" :get #(-> % u/proxy->shape :points grc/points->rect format/format-bounds)} diff --git a/frontend/src/app/plugins/utils.cljs b/frontend/src/app/plugins/utils.cljs index fe2b555cbe..c98a1b3a92 100644 --- a/frontend/src/app/plugins/utils.cljs +++ b/frontend/src/app/plugins/utils.cljs @@ -12,8 +12,7 @@ [app.common.types.container :as ctn] [app.common.types.file :as ctf] [app.main.store :as st] - [app.util.object :as obj] - [promesa.core :as p])) + [app.util.object :as obj])) (defn locate-file [id] @@ -175,7 +174,7 @@ [] (let [ret-v (atom nil) ret-p - (p/create + (js/Promise. (fn [resolve _] (add-watch ret-v diff --git a/manage.sh b/manage.sh index 46c101c282..ccf4d0318b 100755 --- a/manage.sh +++ b/manage.sh @@ -177,13 +177,59 @@ function build-exporter-bundle { rm -rf $bundle_dir; mv ./exporter/target $bundle_dir; - echo $version > $bundle_dir/version.txt put-license-file $bundle_dir; - echo ">> bundle exporter end"; } +function build-docs-bundle { + echo ">> bundle docs start"; + + mkdir -p ./bundles + local version=$(print-current-version); + local bundle_dir="./bundles/docs"; + + build "docs"; + + rm -rf $bundle_dir; + mv ./docs/_dist $bundle_dir; + echo $version > $bundle_dir/version.txt; + put-license-file $bundle_dir; + echo ">> bundle docs end"; +} + + +function build-frontend-docker-images { + rsync -avr --delete ./bundles/frontend/ ./docker/images/bundle-frontend/; + pushd ./docker/images; + docker build -t penpotapp/frontend:$CURRENT_BRANCH -t penpotapp/frontend:latest -f Dockerfile.frontend .; + popd; +} + +function build-backend-docker-images { + rsync -avr --delete ./bundles/backend/ ./docker/images/bundle-backend/; + pushd ./docker/images; + docker build -t penpotapp/backend:$CURRENT_BRANCH -t penpotapp/backend:latest -f Dockerfile.backend .; + popd; +} + +function build-exporter-docker-images { + rsync -avr --delete ./bundles/exporter/ ./docker/images/bundle-exporter/; + pushd ./docker/images; + docker build -t penpotapp/exporter:$CURRENT_BRANCH -t penpotapp/exporter:latest -f Dockerfile.exporter .; + popd; +} + +function usage { + echo "PENPOT build & release manager" + echo "USAGE: $0 OPTION" + echo "Options:" + echo "- pull-devenv Pulls docker development oriented image" + echo "- build-devenv Build docker development oriented image" + echo "- build-devenv-local Build a local docker development oriented image" + echo "- create-devenv Create the development oriented docker compose service." + echo "- start-devenv Start the development oriented docker compose service." + function build-frontend-docker-images { rsync -avr --delete ./bundles/frontend/ ./docker/images/bundle-frontend/; pushd ./docker/images; @@ -224,6 +270,7 @@ function usage { echo "- build-frontend-bundle Build frontend bundle" echo "- build-backend-bundle Build backend bundle." echo "- build-exporter-bundle Build exporter bundle." + echo "- build-docs-bundle Build docs bundle." echo "" echo "- build-docker-images Build all docker images (frontend, backend and exporter)." echo "- build-frontend-docker-images Build frontend docker images." @@ -293,6 +340,10 @@ case $1 in build-exporter-bundle; ;; + build-docs-bundle) + build-docs-bundle; + ;; + build-docker-images) build-frontend-docker-images build-backend-docker-images