diff --git a/backend/deps.edn b/backend/deps.edn index cb45fff87..4e9256efa 100644 --- a/backend/deps.edn +++ b/backend/deps.edn @@ -1,12 +1,12 @@ {:deps {penpot/common {:local/root "../common"} org.clojure/clojure {:mvn/version "1.11.1"} - org.clojure/core.async {:mvn/version "1.5.648"} + org.clojure/core.async {:mvn/version "1.6.673"} ;; Logging - org.zeromq/jeromq {:mvn/version "0.5.2"} + org.zeromq/jeromq {:mvn/version "0.5.3"} - com.github.luben/zstd-jni {:mvn/version "1.5.2-4"} + com.github.luben/zstd-jni {:mvn/version "1.5.2-5"} org.clojure/data.fressian {:mvn/version "1.0.0"} io.prometheus/simpleclient {:mvn/version "0.16.0"} @@ -18,7 +18,7 @@ io.prometheus/simpleclient_httpserver {:mvn/version "0.16.0"} - io.lettuce/lettuce-core {:mvn/version "6.2.1.RELEASE"} + io.lettuce/lettuce-core {:mvn/version "6.2.2.RELEASE"} java-http-clj/java-http-clj {:mvn/version "0.4.3"} funcool/yetti @@ -27,9 +27,9 @@ :git/url "https://github.com/funcool/yetti.git" :exclusions [org.slf4j/slf4j-api]} - com.github.seancorfield/next.jdbc {:mvn/version "1.3.834"} + com.github.seancorfield/next.jdbc {:mvn/version "1.3.847"} metosin/reitit-core {:mvn/version "0.5.18"} - org.postgresql/postgresql {:mvn/version "42.5.0"} + org.postgresql/postgresql {:mvn/version "42.5.1"} com.zaxxer/HikariCP {:mvn/version "5.0.1"} io.whitfin/siphash {:mvn/version "2.0.0"} @@ -37,9 +37,9 @@ buddy/buddy-hashers {:mvn/version "1.8.158"} buddy/buddy-sign {:mvn/version "3.4.333"} - com.github.ben-manes.caffeine/caffeine {:mvn/version "3.1.1"} + com.github.ben-manes.caffeine/caffeine {:mvn/version "3.1.2"} - org.jsoup/jsoup {:mvn/version "1.15.1"} + org.jsoup/jsoup {:mvn/version "1.15.3"} org.im4java/im4java {:git/tag "1.4.0-penpot-2" :git/sha "e2b3e16" @@ -51,11 +51,11 @@ integrant/integrant {:mvn/version "0.8.0"} dawran6/emoji {:mvn/version "0.1.5"} - markdown-clj/markdown-clj {:mvn/version "1.11.3"} + markdown-clj/markdown-clj {:mvn/version "1.11.4"} ;; Pretty Print specs pretty-spec/pretty-spec {:mvn/version "0.1.4"} - software.amazon.awssdk/s3 {:mvn/version "2.17.278"}} + software.amazon.awssdk/s3 {:mvn/version "2.19.5"}} :paths ["src" "resources" "target/classes"] :aliases @@ -69,8 +69,10 @@ mockery/mockery {:mvn/version "RELEASE"}} :extra-paths ["test" "dev"]} + :build - {:extra-deps {io.github.clojure/tools.build {:git/tag "v0.8.3" :git/sha "0d20256"}} + {:extra-deps + {io.github.clojure/tools.build {:git/tag "v0.9.0" :git/sha "8c93e0c"}} :ns-default build} :test diff --git a/backend/src/app/rpc/commands/files.clj b/backend/src/app/rpc/commands/files.clj index 8ec4e9182..054bf22ff 100644 --- a/backend/src/app/rpc/commands/files.clj +++ b/backend/src/app/rpc/commands/files.clj @@ -241,7 +241,6 @@ [conn id client-features] ;; here we check if client requested features are supported (check-features-compatibility! client-features) - (binding [pmap/*load-fn* (partial load-pointer conn id)] (-> (db/get-by-id conn :file id) (decode-row) @@ -473,26 +472,23 @@ (defn get-team-shared-files [conn {:keys [team-id] :as params}] - (let [assets-sample - (fn [assets limit] - (let [sorted-assets (->> (vals assets) - (sort-by #(str/lower (:name %))))] + (letfn [(assets-sample [assets limit] + (let [sorted-assets (->> (vals assets) + (sort-by #(str/lower (:name %))))] + {:count (count sorted-assets) + :sample (into [] (take limit sorted-assets))})) - {:count (count sorted-assets) - :sample (into [] (take limit sorted-assets))})) + (library-summary [{:keys [id data] :as file}] + (binding [pmap/*load-fn* (partial load-pointer conn id)] + {:components (assets-sample (:components data) 4) + :colors (assets-sample (:colors data) 3) + :typographies (assets-sample (:typographies data) 3)}))] - library-summary - (fn [data] - {:components (assets-sample (:components data) 4) - :colors (assets-sample (:colors data) 3) - :typographies (assets-sample (:typographies data) 3)}) - - xform (comp - (map decode-row) - (map #(assoc % :library-summary (library-summary (:data %)))) - (map #(dissoc % :data)))] - - (into #{} xform (db/exec! conn [sql:team-shared-files team-id])))) + (->> (db/exec! conn [sql:team-shared-files team-id]) + (into #{} (comp + (map decode-row) + (map #(assoc % :library-summary (library-summary %))) + (map #(dissoc % :data))))))) (s/def ::get-team-shared-files (s/keys :req [::rpc/profile-id] :req-un [::team-id])) @@ -536,12 +532,14 @@ [conn file-id client-features] (check-features-compatibility! client-features) (->> (db/exec! conn [sql:file-libraries file-id]) - (mapv (fn [{:keys [id] :as row}] - (binding [pmap/*load-fn* (partial load-pointer conn id)] - (-> (decode-row row) - (assoc :is-indirect false) - (update :data dissoc :pages-index) - (handle-file-features client-features))))))) + (map decode-row) + (map #(assoc % :is-indirect false)) + (map (fn [{:keys [id] :as row}] + (binding [pmap/*load-fn* (partial load-pointer conn id)] + (-> row + (update :data dissoc :pages-index) + (handle-file-features client-features))))) + (vec))) (s/def ::get-file-libraries (s/keys :req [::rpc/profile-id] @@ -711,28 +709,30 @@ objects)))] - (let [frame (get-thumbnail-frame data) - frame-id (:id frame) - page-id (or (:page-id frame) - (-> data :pages first)) + (binding [pmap/*load-fn* (partial load-pointer conn id)] + (let [frame (get-thumbnail-frame data) + frame-id (:id frame) + page-id (or (:page-id frame) + (-> data :pages first)) - page (dm/get-in data [:pages-index page-id]) - frame-ids (if (some? frame) (list frame-id) (map :id (ctt/get-frames (:objects page)))) + page (dm/get-in data [:pages-index page-id]) + page (cond-> page (pmap/pointer-map? page) deref) + frame-ids (if (some? frame) (list frame-id) (map :id (ctt/get-frames (:objects page)))) - obj-ids (map #(str page-id %) frame-ids) - thumbs (get-object-thumbnails conn id obj-ids)] + obj-ids (map #(str page-id %) frame-ids) + thumbs (get-object-thumbnails conn id obj-ids)] - (cond-> page - ;; If we have frame, we need to specify it on the page level - ;; and remove the all other unrelated objects. - (some? frame-id) - (-> (assoc :thumbnail-frame-id frame-id) - (update :objects filter-objects frame-id)) + (cond-> page + ;; If we have frame, we need to specify it on the page level + ;; and remove the all other unrelated objects. + (some? frame-id) + (-> (assoc :thumbnail-frame-id frame-id) + (update :objects filter-objects frame-id)) - ;; Assoc the available thumbnails and prune not visible shapes - ;; for avoid transfer unnecessary data. - :always - (update :objects assoc-thumbnails page-id thumbs))))) + ;; Assoc the available thumbnails and prune not visible shapes + ;; for avoid transfer unnecessary data. + :always + (update :objects assoc-thumbnails page-id thumbs)))))) (s/def ::get-file-data-for-thumbnail (s/keys :req [::rpc/profile-id] @@ -746,12 +746,15 @@ [{:keys [pool] :as cfg} {:keys [::rpc/profile-id file-id features] :as props}] (with-open [conn (db/open pool)] (check-read-permissions! conn profile-id file-id) - (let [file (get-file conn file-id features)] + ;; NOTE: we force here the "storage/pointer-map" feature, because + ;; it used internally only and is independent if user supports it + ;; or not. + (let [feat (into #{"storage/pointer-map"} features) + file (get-file conn file-id feat)] {:file-id file-id :revn (:revn file) :page (get-file-data-for-thumbnail conn file)}))) - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; MUTATION COMMANDS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/backend/src/app/rpc/commands/files/update.clj b/backend/src/app/rpc/commands/files/update.clj index 7c788553c..f24dede18 100644 --- a/backend/src/app/rpc/commands/files/update.clj +++ b/backend/src/app/rpc/commands/files/update.clj @@ -168,7 +168,18 @@ (->> changes-with-metadata (mapcat :changes) vec) (vec changes)) - params (assoc params :file file :changes changes)] + params (-> params + (assoc :file file) + (assoc :changes changes) + (assoc ::created-at (dt/now)))] + + (when (> (:revn params) + (:revn file)) + (ex/raise :type :validation + :code :revn-conflict + :hint "The incoming revision number is greater that stored version." + :context {:incoming-revn (:revn params) + :stored-revn (:revn file)})) (mtx/run! metrics {:id :update-file-changes :inc (count changes)}) @@ -180,24 +191,15 @@ (-> (update-fn cfg params) (vary-meta assoc ::audit/replace-props - {:id (:id file) - :name (:name file) - :features (:features file) + {:id (:id file) + :name (:name file) + :features (:features file) :project-id (:project-id file) :team-id (:team-id file)})))))) (defn- update-file* - [{:keys [conn] :as cfg} {:keys [profile-id file changes session-id] :as params}] - (when (> (:revn params) - (:revn file)) - (ex/raise :type :validation - :code :revn-conflict - :hint "The incoming revision number is greater that stored version." - :context {:incoming-revn (:revn params) - :stored-revn (:revn file)})) - - (let [ts (dt/now) - file (-> file + [{:keys [conn] :as cfg} {:keys [profile-id file changes session-id ::created-at] :as params}] + (let [file (-> file (update :revn inc) (update :data (fn [data] (cond-> data @@ -217,7 +219,7 @@ {:id (uuid/next) :session-id session-id :profile-id profile-id - :created-at ts + :created-at created-at :file-id (:id file) :revn (:revn file) :features (db/create-array conn "text" (:features file)) @@ -229,12 +231,12 @@ {:revn (:revn file) :data (:data file) :data-backend nil - :modified-at ts + :modified-at created-at :has-media-trimmed false} {:id (:id file)}) (db/update! conn :project - {:modified-at ts} + {:modified-at created-at} {:id (:project-id file)}) (let [params (assoc params :file file)] @@ -265,13 +267,10 @@ order by s.created_at asc") (defn- get-lagged-changes - [conn params] - (->> (db/exec! conn [sql:lagged-changes (:id params) (:revn params)]) - (into [] (comp (map files/decode-row) - (map (fn [row] - (cond-> row - (= (:revn row) (:revn (:file params))) - (assoc :changes [])))))))) + [conn {:keys [id revn] :as params}] + (->> (db/exec! conn [sql:lagged-changes id revn]) + (map files/decode-row) + (vec))) (defn- send-notifications! [{:keys [conn] :as cfg} {:keys [file changes session-id] :as params}] diff --git a/backend/src/app/srepl/helpers.clj b/backend/src/app/srepl/helpers.clj index d37d0f520..38c943a08 100644 --- a/backend/src/app/srepl/helpers.clj +++ b/backend/src/app/srepl/helpers.clj @@ -11,6 +11,7 @@ [app.auth :refer [derive-password]] [app.common.data :as d] [app.common.exceptions :as ex] + [app.common.files.features :as ffeat] [app.common.logging :as l] [app.common.pages :as cp] [app.common.pages.migrations :as pmg] @@ -21,8 +22,11 @@ [app.db :as db] [app.db.sql :as sql] [app.main :refer [system]] + [app.rpc.commands.files :as files] [app.rpc.queries.profile :as prof] [app.util.blob :as blob] + [app.util.objects-map :as omap] + [app.util.pointer-map :as pmap] [app.util.time :as dt] [clojure.spec.alpha :as s] [clojure.stacktrace :as strace] @@ -66,23 +70,33 @@ [system & {:keys [update-fn id save? migrate? inc-revn?] :or {save? false migrate? true inc-revn? true}}] (db/with-atomic [conn (:app.db/pool system)] - (let [file (db/get-by-id conn :file id {:for-update true}) - file (-> file - (update :features db/decode-pgarray #{}) - (update :data blob/decode) - (cond-> migrate? (update :data pmg/migrate-data))) - file (binding [*conn* conn] - (-> (update-fn file) - (cond-> inc-revn? (update :revn inc))))] - (when save? - (let [features (db/create-array conn "text" (:features file)) - data (blob/encode (:data file))] - (db/update! conn :file - {:data data - :revn (:revn file) - :features features} - {:id id}))) - file))) + (let [file (-> (db/get-by-id conn :file id {:for-update true}) + (update :features db/decode-pgarray #{}))] + (binding [*conn* conn + pmap/*tracked* (atom {}) + pmap/*load-fn* (partial files/load-pointer conn id) + ffeat/*wrap-with-pointer-map-fn* + (if (contains? (:features file) "storage/pointer-map") pmap/wrap identity) + ffeat/*wrap-with-objects-map-fn* + (if (contains? (:features file) "storage/objectd-map") omap/wrap identity)] + (let [file (-> file + (update :data blob/decode) + (cond-> migrate? (update :data pmg/migrate-data)) + (update-fn) + (cond-> inc-revn? (update :revn inc)))] + (when save? + (let [features (db/create-array conn "text" (:features file)) + data (blob/encode (:data file))] + (db/update! conn :file + {:data data + :revn (:revn file) + :features features} + {:id id}) + + (when (contains? (:features file) "storage/pointer-map") + (files/persist-pointers! conn id)))) + + (dissoc file :data)))))) (def ^:private sql:retrieve-files-chunk "SELECT id, name, created_at, data FROM file diff --git a/backend/src/app/srepl/main.clj b/backend/src/app/srepl/main.clj index 80d5a7035..ae09aa2ff 100644 --- a/backend/src/app/srepl/main.clj +++ b/backend/src/app/srepl/main.clj @@ -110,10 +110,10 @@ (if (contains? features "storage/objects-map") file (-> file - (update :data migrate-to-omap) + (update :data migrate) (update :features conj "storage/objects-map")))) - (migrate-to-omap [data] + (migrate [data] (-> data (update :pages-index update-vals #(update % :objects omap/wrap)) (update :components update-vals #(update % :objects omap/wrap))))] @@ -125,24 +125,17 @@ (defn enable-pointer-map-feature-on-file! [system & {:keys [save? id]}] - (letfn [(update-file [{:keys [features id] :as file}] + (letfn [(update-file [{:keys [features] :as file}] (if (contains? features "storage/pointer-map") file (-> file - (update :data migrate-to-omap id) + (update :data migrate) (update :features conj "storage/pointer-map")))) - (migrate-to-omap [data file-id] - (binding [pmap/*tracked* (atom {})] - (let [data (-> data - (update :pages-index update-vals pmap/wrap) - (update :components pmap/wrap))] - (doseq [[id item] @pmap/*tracked*] - (db/insert! h/*conn* :file-data-fragment - {:id id - :file-id file-id - :content (-> item deref blob/encode)})) - data)))] + (migrate [data] + (-> data + (update :pages-index update-vals pmap/wrap) + (update :components pmap/wrap)))] (h/update-file! system :id id diff --git a/common/deps.edn b/common/deps.edn index de4ef462a..c4471b17e 100644 --- a/common/deps.edn +++ b/common/deps.edn @@ -1,8 +1,8 @@ {:deps {org.clojure/clojure {:mvn/version "1.11.1"} org.clojure/data.json {:mvn/version "2.4.0"} - org.clojure/tools.cli {:mvn/version "1.0.206"} - metosin/jsonista {:mvn/version "0.3.6"} + org.clojure/tools.cli {:mvn/version "1.0.214"} + metosin/jsonista {:mvn/version "0.3.7"} org.clojure/clojurescript {:mvn/version "1.11.60"} org.clojure/test.check {:mvn/version "1.1.1"} @@ -23,7 +23,7 @@ com.cognitect/transit-cljs {:mvn/version "0.8.280"} java-http-clj/java-http-clj {:mvn/version "0.4.3"} - funcool/promesa {:mvn/version "10.0.571"} + funcool/promesa {:mvn/version "10.0.582"} funcool/cuerdas {:mvn/version "2022.06.16-403"} lambdaisland/uri {:mvn/version "1.13.95" @@ -37,21 +37,22 @@ ;; exception printing fipp/fipp {:mvn/version "0.6.26"} - io.aviso/pretty {:mvn/version "1.1.1"} + io.aviso/pretty {:mvn/version "1.3"} environ/environ {:mvn/version "1.2.0"}} :paths ["src" "target/classes"] :aliases {:dev {:extra-deps {org.clojure/tools.namespace {:mvn/version "RELEASE"} - thheller/shadow-cljs {:mvn/version "2.20.2"} + thheller/shadow-cljs {:mvn/version "2.20.16"} com.bhauman/rebel-readline {:mvn/version "RELEASE"} criterium/criterium {:mvn/version "RELEASE"} mockery/mockery {:mvn/version "RELEASE"}} :extra-paths ["test" "dev"]} :build - {:extra-deps {io.github.clojure/tools.build {:git/tag "v0.8.3" :git/sha "0d20256"}} + {:extra-deps + {io.github.clojure/tools.build {:git/tag "v0.9.0" :git/sha "8c93e0c"}} :ns-default build} :test diff --git a/common/package.json b/common/package.json index 68eb89620..6f0984c7f 100644 --- a/common/package.json +++ b/common/package.json @@ -4,7 +4,7 @@ "main": "index.js", "license": "MPL-2.0", "dependencies": { - "luxon": "^1.27.0" + "luxon": "^3.1.1" }, "scripts": { "compile-and-watch-test": "clojure -M:dev:shadow-cljs watch test", @@ -13,8 +13,8 @@ "test": "yarn run compile-test && yarn run run-test" }, "devDependencies": { - "shadow-cljs": "2.19.8", - "source-map-support": "^0.5.19", - "ws": "^7.4.6" + "shadow-cljs": "2.20.16", + "source-map-support": "^0.5.21", + "ws": "^8.11.0" } } diff --git a/common/yarn.lock b/common/yarn.lock index 5ee0581ae..359d69826 100644 --- a/common/yarn.lock +++ b/common/yarn.lock @@ -305,10 +305,10 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= -luxon@^1.27.0: - version "1.27.0" - resolved "https://registry.yarnpkg.com/luxon/-/luxon-1.27.0.tgz#ae10c69113d85dab8f15f5e8390d0cbeddf4f00f" - integrity sha512-VKsFsPggTA0DvnxtJdiExAucKdAnwbCCNlMM5ENvHlxubqWd0xhZcdb4XgZ7QFNhaRhilXCFxHuoObP5BNA4PA== +luxon@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.1.1.tgz#b492c645b2474fb86f3bd3283213846b99c32c1e" + integrity sha512-Ah6DloGmvseB/pX1cAmjbFvyU/pKuwQMQqz7d0yvuDlVYLTs2WeDHQMpC8tGjm1da+BriHROW/OEIT/KfYg6xw== md5.js@^1.3.4: version "1.3.5" @@ -533,10 +533,10 @@ shadow-cljs-jar@1.3.2: resolved "https://registry.yarnpkg.com/shadow-cljs-jar/-/shadow-cljs-jar-1.3.2.tgz#97273afe1747b6a2311917c1c88d9e243c81957b" integrity sha512-XmeffAZHv8z7451kzeq9oKh8fh278Ak+UIOGGrapyqrFBB773xN8vMQ3O7J7TYLnb9BUwcqadKkmgaq7q6fhZg== -shadow-cljs@2.19.8: - version "2.19.8" - resolved "https://registry.yarnpkg.com/shadow-cljs/-/shadow-cljs-2.19.8.tgz#1ce96cab3e4903bed8d401ffbe88b8939f5454d3" - integrity sha512-6qek3mcAP0hrnC5FxrTebBrgLGpOuhlnp06vdxp6g0M5Gl6w2Y0hzSwa1s2K8fMOkzE4/ciQor75b2y64INgaw== +shadow-cljs@2.20.16: + version "2.20.16" + resolved "https://registry.yarnpkg.com/shadow-cljs/-/shadow-cljs-2.20.16.tgz#32e83586fcc91a246b7fb622349135ad84ca1a19" + integrity sha512-k33ssZppDkBSYIfKswiKOX/8bNTnHbHoTmwf3KBPXBQkDPptPR3FeedmWtS5vKWnucFTe9DObhM2exKocErIxw== dependencies: node-libs-browser "^2.2.1" readline-sync "^1.4.7" @@ -552,10 +552,10 @@ source-map-support@^0.4.15: dependencies: source-map "^0.5.6" -source-map-support@^0.5.19: - version "0.5.19" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" - integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== +source-map-support@^0.5.21: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -664,6 +664,11 @@ ws@^7.4.6: resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== +ws@^8.11.0: + version "8.11.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.11.0.tgz#6a0d36b8edfd9f96d8b25683db2f8d7de6e8e143" + integrity sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg== + xtend@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" diff --git a/docker/images/docker-compose.yaml b/docker/images/docker-compose.yaml index 586f39873..b8ae99216 100644 --- a/docker/images/docker-compose.yaml +++ b/docker/images/docker-compose.yaml @@ -243,20 +243,22 @@ services: ## An optional admin application for pentpot. It allows manage ## users, teams and inspect some parts of the database. You can read ## more about it on: https://github.com/penpot/penpot-admin + ## + ## Status: EXPERIMENTAL # penpot-admin: # image: "penpotapp/admin:alpha" # networks: # - penpot - + # # depends_on: # - penpot-postgres # - penpot-backend - + # # environment: # - PENPOT_PUBLIC_URI=http://localhost:9001 # - PENPOT_API_URI=http://penpot-frontend/ - + # # - PENPOT_DATABASE_HOST=penpot-postgres # - PENPOT_DATABASE_NAME=penpot # - PENPOT_DATABASE_USERNAME=penpot diff --git a/exporter/deps.edn b/exporter/deps.edn index ade109ab8..e28478a5c 100644 --- a/exporter/deps.edn +++ b/exporter/deps.edn @@ -15,7 +15,7 @@ :dev {:extra-deps - {thheller/shadow-cljs {:mvn/version "2.20.2"}}} + {thheller/shadow-cljs {:mvn/version "2.20.16"}}} :shadow-cljs {:main-opts ["-m" "shadow.cljs.devtools.cli"]} diff --git a/exporter/package.json b/exporter/package.json index 9f78d2c74..514752101 100644 --- a/exporter/package.json +++ b/exporter/package.json @@ -13,15 +13,15 @@ "cookies": "^0.8.0", "generic-pool": "^3.9.0", "inflation": "^2.0.0", - "ioredis": "^5.2.3", - "luxon": "^3.0.4", - "playwright": "^1.26.1", + "ioredis": "^5.2.4", + "luxon": "^3.1.1", + "playwright": "^1.29.1", "raw-body": "^2.5.1", "xml-js": "^1.6.11", "xregexp": "^5.1.1" }, "devDependencies": { - "shadow-cljs": "^2.20.2", + "shadow-cljs": "^2.20.16", "source-map-support": "^0.5.21" } } diff --git a/exporter/yarn.lock b/exporter/yarn.lock index c3b3c4e58..0a2d6dbfe 100644 --- a/exporter/yarn.lock +++ b/exporter/yarn.lock @@ -523,10 +523,10 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -ioredis@^5.2.3: - version "5.2.3" - resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-5.2.3.tgz#d5b37eb13e643241660d6cee4eeb41a026cda8c0" - integrity sha512-gQNcMF23/NpvjCaa1b5YycUyQJ9rBNH2xP94LWinNpodMWVUPP5Ai/xXANn/SM7gfIvI62B5CCvZxhg5pOgyMw== +ioredis@^5.2.4: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-5.2.4.tgz#9e262a668bc29bae98f2054c1e0d7efd86996b96" + integrity sha512-qIpuAEt32lZJQ0XyrloCRdlEdUUNGG9i0UOk6zgzK6igyudNWqEBxfH6OlbnOOoBBvr1WB02mm8fR55CnikRng== dependencies: "@ioredis/commands" "^1.1.1" cluster-key-slot "^1.1.0" @@ -592,10 +592,10 @@ lodash.union@^4.6.0: resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" integrity sha1-SLtQiECfFvGCFmZkHETdGqrjzYg= -luxon@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.0.4.tgz#d179e4e9f05e092241e7044f64aaa54796b03929" - integrity sha512-aV48rGUwP/Vydn8HT+5cdr26YYQiUZ42NM6ToMoaGKwYfWbfLeRkEu1wXWMHBZT6+KyLfcbbtVcoQFCbbPjKlw== +luxon@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.1.1.tgz#b492c645b2474fb86f3bd3283213846b99c32c1e" + integrity sha512-Ah6DloGmvseB/pX1cAmjbFvyU/pKuwQMQqz7d0yvuDlVYLTs2WeDHQMpC8tGjm1da+BriHROW/OEIT/KfYg6xw== md5.js@^1.3.4: version "1.3.5" @@ -724,17 +724,17 @@ pbkdf2@^3.0.3: safe-buffer "^5.0.1" sha.js "^2.4.8" -playwright-core@1.26.1: - version "1.26.1" - resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.26.1.tgz#a162f476488312dcf12638d97685144de6ada512" - integrity sha512-hzFchhhxnEiPc4qVPs9q2ZR+5eKNifY2hQDHtg1HnTTUuphYCBP8ZRb2si+B1TR7BHirgXaPi48LIye5SgrLAA== +playwright-core@1.29.1: + version "1.29.1" + resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.29.1.tgz#9ec15d61c4bd2f386ddf6ce010db53a030345a47" + integrity sha512-20Ai3d+lMkWpI9YZYlxk8gxatfgax5STW8GaMozAHwigLiyiKQrdkt7gaoT9UQR8FIVDg6qVXs9IoZUQrDjIIg== -playwright@^1.26.1: - version "1.26.1" - resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.26.1.tgz#0082c1d6a1c9cefe3f7a593396ad8568746184d0" - integrity sha512-WQmEdCgYYe8jOEkhkW9QLcK0PB+w1RZztBLYIT10MEEsENYg251cU0IzebDINreQsUt+HCwwRhtdz4weH9ICcQ== +playwright@^1.29.1: + version "1.29.1" + resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.29.1.tgz#fc04b34f42e3bfc0edadb1c45ef9bffd53c21f70" + integrity sha512-lasC+pMqsQ2uWhNurt3YK3xo0gWlMjslYUylKbHcqF/NTjwp9KStRGO7S6wwz2f52GcSnop8XUK/GymJjdzrxw== dependencies: - playwright-core "1.26.1" + playwright-core "1.29.1" printj@~1.3.1: version "1.3.1" @@ -910,10 +910,10 @@ shadow-cljs-jar@1.3.2: resolved "https://registry.yarnpkg.com/shadow-cljs-jar/-/shadow-cljs-jar-1.3.2.tgz#97273afe1747b6a2311917c1c88d9e243c81957b" integrity sha512-XmeffAZHv8z7451kzeq9oKh8fh278Ak+UIOGGrapyqrFBB773xN8vMQ3O7J7TYLnb9BUwcqadKkmgaq7q6fhZg== -shadow-cljs@^2.20.2: - version "2.20.2" - resolved "https://registry.yarnpkg.com/shadow-cljs/-/shadow-cljs-2.20.2.tgz#24a4b204f1f2288dc4ff2d0a4f3972a6e5307645" - integrity sha512-2kzWnV1QM6KBetziCAkCf8BJdnDX2CwiAr4yhvOsiQpaNJcMzwMsJTX/gTHz58yQg0dV5uwPsIyBlvyIfl30rg== +shadow-cljs@^2.20.16: + version "2.20.16" + resolved "https://registry.yarnpkg.com/shadow-cljs/-/shadow-cljs-2.20.16.tgz#32e83586fcc91a246b7fb622349135ad84ca1a19" + integrity sha512-k33ssZppDkBSYIfKswiKOX/8bNTnHbHoTmwf3KBPXBQkDPptPR3FeedmWtS5vKWnucFTe9DObhM2exKocErIxw== dependencies: node-libs-browser "^2.2.1" readline-sync "^1.4.7" diff --git a/frontend/deps.edn b/frontend/deps.edn index b5944ea6e..606fa73c9 100644 --- a/frontend/deps.edn +++ b/frontend/deps.edn @@ -33,13 +33,12 @@ {com.bhauman/rebel-readline {:mvn/version "RELEASE"}} :main-opts ["-m" "rebel-readline.main"]} - :dev {:extra-paths ["dev"] :extra-deps - {thheller/shadow-cljs {:mvn/version "2.20.2"} + {thheller/shadow-cljs {:mvn/version "2.20.16"} org.clojure/tools.namespace {:mvn/version "RELEASE"} - cider/cider-nrepl {:mvn/version "0.28.4"}}} + cider/cider-nrepl {:mvn/version "0.29.0"}}} :shadow-cljs {:main-opts ["-m" "shadow.cljs.devtools.cli"]} diff --git a/frontend/package.json b/frontend/package.json index 4463f90d3..7bc107fd6 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -26,7 +26,7 @@ "test-e2e-gui": "cypress open" }, "devDependencies": { - "autoprefixer": "^10.4.7", + "autoprefixer": "^10.4.13", "cypress": "^10.3.0", "cypress-file-upload": "^5.0.8", "gettext-parser": "^5.1.2", @@ -40,37 +40,37 @@ "gulp-sourcemaps": "^3.0.0", "gulp-svg-sprite": "^1.5.0", "map-stream": "0.0.7", - "marked": "^4.0.17", + "marked": "^4.2.5", "mkdirp": "^1.0.4", - "nodemon": "^2.0.19", + "nodemon": "^2.0.20", "npm-run-all": "^4.1.5", - "postcss": "^8.4.14", + "postcss": "^8.4.20", "postcss-clean": "^1.2.2", - "prettier": "^2.7.1", + "prettier": "^2.8.1", "rimraf": "^3.0.0", - "sass": "^1.53.0", - "shadow-cljs": "2.20.2" + "sass": "^1.57.1", + "shadow-cljs": "2.20.16" }, "dependencies": { "@sentry/browser": "^6.17.4", "@sentry/tracing": "^6.17.4", - "date-fns": "^2.28.0", + "date-fns": "^2.29.3", "draft-js": "^0.11.7", - "highlight.js": "^11.6.0", - "js-beautify": "^1.14.4", - "jszip": "^3.10.0", - "luxon": "^3.0.1", + "highlight.js": "^11.7.0", + "js-beautify": "^1.14.7", + "jszip": "^3.10.1", + "luxon": "^3.1.1", "mousetrap": "^1.6.5", "opentype.js": "^1.3.4", "randomcolor": "^0.6.2", "react": "~17.0.2", "react-dom": "~17.0.2", "react-virtualized": "^9.22.3", - "rxjs": "~7.5.5", + "rxjs": "~7.8.0", "sax": "^1.2.4", "source-map-support": "^0.5.21", "tdigest": "^0.1.2", - "ua-parser-js": "^1.0.2", + "ua-parser-js": "^1.0.32", "xregexp": "^5.1.1" } } diff --git a/frontend/src/app/main/data/workspace.cljs b/frontend/src/app/main/data/workspace.cljs index e6517f329..55d98260c 100644 --- a/frontend/src/app/main/data/workspace.cljs +++ b/frontend/src/app/main/data/workspace.cljs @@ -150,14 +150,15 @@ (defn- bundle-fetched [features [{:keys [id data] :as file} thumbnails project users comments-users]] - (letfn [(resolve-pointer [[key pointer]] - (->> (rp/cmd! :get-file-fragment {:file-id id :fragment-id @pointer}) + (letfn [(resolve-pointer [file-id [key pointer]] + (->> (rp/cmd! :get-file-fragment {:file-id file-id :fragment-id @pointer}) (rx/map :content) (rx/map #(vector key %)))) - (resolve-pointers [in-to coll] + + (resolve-pointers [file-id coll] (->> (rx/from (seq coll)) - (rx/merge-map resolve-pointer) - (rx/reduce conj in-to)))] + (rx/merge-map (partial resolve-pointer file-id)) + (rx/reduce conj {})))] (ptk/reify ::bundle-fetched ptk/UpdateEvent @@ -186,7 +187,7 @@ (rx/merge-map (fn [[_ page :as kp]] (if (t/pointer? page) - (resolve-pointer kp) + (resolve-pointer id kp) (rx/of kp)))) (rx/merge-map (fn [[id page]] @@ -212,15 +213,17 @@ (->> data (filter (comp t/pointer? val)) - (resolve-pointers {}) + (resolve-pointers id) (rx/map workspace-data-pointers-loaded)) (->> (rp/cmd! :get-file-libraries {:file-id id :features features}) (rx/mapcat identity) (rx/mapcat - (fn [file] - (->> (filter (comp t/pointer? val) file) - (resolve-pointers file)))) + (fn [{:keys [id data] :as file}] + (->> (filter (comp t/pointer? val) data) + (resolve-pointers id) + (rx/map #(update file :data merge %))))) + (rx/reduce conj []) (rx/map libraries-fetched))))))) (rx/take-until stoper))))))) diff --git a/frontend/src/app/main/data/workspace/persistence.cljs b/frontend/src/app/main/data/workspace/persistence.cljs index a18acb48c..29df1fd43 100644 --- a/frontend/src/app/main/data/workspace/persistence.cljs +++ b/frontend/src/app/main/data/workspace/persistence.cljs @@ -148,12 +148,7 @@ (->> (rp/cmd! :update-file params) (rx/mapcat (fn [lagged] (log/debug :hint "changes persisted" :lagged (count lagged)) - (let [lagged-updates - (cond->> lagged - (= #{sid} (into #{} (map :session-id) lagged)) - (map #(assoc % :changes []))) - - frame-updates + (let [frame-updates (-> (group-by :page-id changes) (update-vals #(into #{} (mapcat :frames) %)))] @@ -162,9 +157,13 @@ (rx/mapcat (fn [[page-id frames]] (->> frames (map #(vector page-id %))))) (rx/map (fn [[page-id frame-id]] (dwt/update-thumbnail (:id file) page-id frame-id)))) - (->> (rx/of lagged-updates) - (rx/mapcat seq) - (rx/map #(shapes-changes-persisted file-id %))))))) + (->> (rx/from lagged) + (rx/merge-map (fn [{:keys [changes] :as entry}] + (rx/merge + (rx/from + (for [[page-id changes] (group-by :page-id changes)] + (dch/update-indices page-id changes))) + (rx/of (shapes-changes-persisted file-id entry)))))))))) (rx/catch (fn [cause] (rx/concat (if (= :authentication (:type cause)) diff --git a/frontend/src/app/main/repo.cljs b/frontend/src/app/main/repo.cljs index 2fa651daf..55c2e3976 100644 --- a/frontend/src/app/main/repo.cljs +++ b/frontend/src/app/main/repo.cljs @@ -22,6 +22,7 @@ (derive :get-team-members ::query) (derive :get-team-stats ::query) (derive :get-team-invitations ::query) +(derive :get-team-shared-files ::query) (defn handle-response [{:keys [status body] :as response}] diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 847d2c770..4a2d2502a 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -182,7 +182,7 @@ resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.7.5.tgz#09fa51e356d07d0be200642b0e4f91d8e6dd408d" integrity sha512-V3BIhmY36fXZ1OtVcI9W+FxQqxVLsPKcNjWigIaa81dLC9IolJl5Mt4Cvhmr0flUnjSpTdrbMTSbXqYqV5dT6A== -abbrev@1: +abbrev@1, abbrev@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== @@ -465,13 +465,13 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -autoprefixer@^10.4.7: - version "10.4.7" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.7.tgz#1db8d195f41a52ca5069b7593be167618edbbedf" - integrity sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA== +autoprefixer@^10.4.13: + version "10.4.13" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.13.tgz#b5136b59930209a321e9fa3dca2e7c4d223e83a8" + integrity sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg== dependencies: - browserslist "^4.20.3" - caniuse-lite "^1.0.30001335" + browserslist "^4.21.4" + caniuse-lite "^1.0.30001426" fraction.js "^4.2.0" normalize-range "^0.1.2" picocolors "^1.0.0" @@ -587,6 +587,13 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + braces@^2.3.1, braces@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" @@ -676,15 +683,15 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^4.20.3: - version "4.21.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.1.tgz#c9b9b0a54c7607e8dc3e01a0d311727188011a00" - integrity sha512-Nq8MFCSrnJXSc88yliwlzQe3qNe3VntIjhsArW9IJOEPSHNx23FalwApUVbzAWABLhYJJ7y8AynWI/XM8OdfjQ== +browserslist@^4.21.4: + version "4.21.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" + integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== dependencies: - caniuse-lite "^1.0.30001359" - electron-to-chromium "^1.4.172" - node-releases "^2.0.5" - update-browserslist-db "^1.0.4" + caniuse-lite "^1.0.30001400" + electron-to-chromium "^1.4.251" + node-releases "^2.0.6" + update-browserslist-db "^1.0.9" buffer-crc32@~0.2.3: version "0.2.13" @@ -771,10 +778,10 @@ camelcase@^5.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -caniuse-lite@^1.0.30001335, caniuse-lite@^1.0.30001359: - version "1.0.30001364" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001364.tgz#1e118f0e933ed2b79f8d461796b8ce45398014a0" - integrity sha512-9O0xzV3wVyX0SlegIQ6knz+okhBB5pE0PC40MNdwcipjwpxoUEHL24uJ+gG42cgklPjfO5ZjZPme9FTSN3QT2Q== +caniuse-lite@^1.0.30001400, caniuse-lite@^1.0.30001426: + version "1.0.30001441" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001441.tgz#987437b266260b640a23cd18fbddb509d7f69f3e" + integrity sha512-OyxRR4Vof59I3yGWXws6i908EtGbMzVUi3ganaZQHmydk1iwDhRnvaPG2WaR0KcqrDFKrxVZHULT396LEPhXfg== caseless@~0.12.0: version "0.12.0" @@ -1364,10 +1371,10 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -date-fns@^2.28.0: - version "2.28.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.28.0.tgz#9570d656f5fc13143e50c975a3b6bbeb46cd08b2" - integrity sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw== +date-fns@^2.29.3: + version "2.29.3" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.3.tgz#27402d2fc67eb442b511b70bbdf98e6411cd68a8" + integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA== dayjs@^1.10.4: version "1.10.7" @@ -1571,10 +1578,10 @@ editorconfig@^0.15.3: semver "^5.6.0" sigmund "^1.0.1" -electron-to-chromium@^1.4.172: - version "1.4.185" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.185.tgz#3432d7944f1c5fe20664bb45d9cced2151405ce2" - integrity sha512-9kV/isoOGpKkBt04yYNaSWIBn3187Q5VZRtoReq8oz5NY/A4XmU6cAoqgQlDp7kKJCZMRjWZ8nsQyxfpFHvfyw== +electron-to-chromium@^1.4.251: + version "1.4.284" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" + integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== elliptic@^6.5.3: version "6.5.4" @@ -2225,6 +2232,17 @@ glob@^7.1.1, glob@^7.1.3, glob@^7.2.0: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.0.3.tgz#415c6eb2deed9e502c68fa44a272e6da6eeca42e" + integrity sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + global-dirs@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-3.0.0.tgz#70a76fe84ea315ab37b1f5576cbde7d48ef72686" @@ -2493,10 +2511,10 @@ hasha@^2.2.0: is-stream "^1.0.1" pinkie-promise "^2.0.0" -highlight.js@^11.6.0: - version "11.6.0" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-11.6.0.tgz#a50e9da05763f1bb0c1322c8f4f755242cff3f5a" - integrity sha512-ig1eqDzJaB0pqEvlPVIpSSyMaO92bH1N2rJpLMN/nX396wTpDA4Eq0uK+7I/2XG17pFaaKE0kjV/XPeGt7Evjw== +highlight.js@^11.7.0: + version "11.7.0" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-11.7.0.tgz#3ff0165bc843f8c9bce1fd89e2fda9143d24b11e" + integrity sha512-1rRqesRFhMO/PRF+G86evnyJkCgaZFOI+Z6kdj15TA18funfoqJXvgPCLSf0SWq3SRfg1j3HlDs8o4s3EGq1oQ== hmac-drbg@^1.0.1: version "1.0.1" @@ -2977,15 +2995,15 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= -js-beautify@^1.14.4: - version "1.14.4" - resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.14.4.tgz#187d600a835f84de67a6d09ceaf3f199b7284c82" - integrity sha512-+b4A9c3glceZEmxyIbxDOYB0ZJdReLvyU1077RqKsO4dZx9FUHjTOJn8VHwpg33QoucIykOiYbh7MfqBOghnrA== +js-beautify@^1.14.7: + version "1.14.7" + resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.14.7.tgz#9206296de33f86dc106d3e50a35b7cf8729703b2" + integrity sha512-5SOX1KXPFKx+5f6ZrPsIPEY7NwKeQz47n3jm2i+XeHx9MoRsfQenlOP13FQhWvg8JRS0+XLO6XYUQ2GX+q+T9A== dependencies: config-chain "^1.1.13" editorconfig "^0.15.3" - glob "^7.1.3" - nopt "^5.0.0" + glob "^8.0.3" + nopt "^6.0.0" "js-tokens@^3.0.0 || ^4.0.0": version "4.0.0" @@ -3066,10 +3084,10 @@ jsprim@^2.0.2: json-schema "0.4.0" verror "1.10.0" -jszip@^3.10.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.10.0.tgz#faf3db2b4b8515425e34effcdbb086750a346061" - integrity sha512-LDfVtOLtOxb9RXkYOwPyNBTQDL4eUbqahtoY6x07GiDJHwSYvn8sHHIw8wINImV3MqbMNve2gSuM1DDqEKk09Q== +jszip@^3.10.1: + version "3.10.1" + resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2" + integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== dependencies: lie "~3.3.0" pako "~1.0.2" @@ -3297,10 +3315,10 @@ lru-queue@^0.1.0: dependencies: es5-ext "~0.10.2" -luxon@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.0.1.tgz#6901111d10ad06fd267ad4e4128a84bef8a77299" - integrity sha512-hF3kv0e5gwHQZKz4wtm4c+inDtyc7elkanAsBq+fundaCdUBNJB1dHEGUZIM6SfSBUlbVFduPwEtNjFK8wLtcw== +luxon@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.1.1.tgz#b492c645b2474fb86f3bd3283213846b99c32c1e" + integrity sha512-Ah6DloGmvseB/pX1cAmjbFvyU/pKuwQMQqz7d0yvuDlVYLTs2WeDHQMpC8tGjm1da+BriHROW/OEIT/KfYg6xw== make-iterator@^1.0.0: version "1.0.1" @@ -3326,10 +3344,10 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -marked@^4.0.17: - version "4.0.17" - resolved "https://registry.yarnpkg.com/marked/-/marked-4.0.17.tgz#1186193d85bb7882159cdcfc57d1dfccaffb3fe9" - integrity sha512-Wfk0ATOK5iPxM4ptrORkFemqroz0ZDxp5MWfYA7H/F+wO17NRWV5Ypxi6p3g2Xmw2bKeiYOl6oVnLHKxBA0VhA== +marked@^4.2.5: + version "4.2.5" + resolved "https://registry.yarnpkg.com/marked/-/marked-4.2.5.tgz#979813dfc1252cc123a79b71b095759a32f42a5d" + integrity sha512-jPueVhumq7idETHkb203WDD4fMA3yV9emQ5vLwop58lu8bTclMghBWcYAavlDqIEMaisADinV1TooIFCfqOsYQ== matchdep@^2.0.0: version "2.0.0" @@ -3438,13 +3456,20 @@ minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -minimatch@^3.0.4: +minimatch@^3.0.4, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" +minimatch@^5.0.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.2.tgz#0939d7d6f0898acbd1508abe534d1929368a8fff" + integrity sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg== + dependencies: + brace-expansion "^2.0.1" + minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" @@ -3583,20 +3608,20 @@ node-libs-browser@^2.2.1: util "^0.11.0" vm-browserify "^1.0.1" -node-releases@^2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" - integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== +node-releases@^2.0.6: + version "2.0.8" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.8.tgz#0f349cdc8fcfa39a92ac0be9bc48b7706292b9ae" + integrity sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A== -nodemon@^2.0.19: - version "2.0.19" - resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.19.tgz#cac175f74b9cb8b57e770d47841995eebe4488bd" - integrity sha512-4pv1f2bMDj0Eeg/MhGqxrtveeQ5/G/UVe9iO6uTZzjnRluSA4PVWf8CW99LUPwGB3eNIA7zUFoP77YuI7hOc0A== +nodemon@^2.0.20: + version "2.0.20" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.20.tgz#e3537de768a492e8d74da5c5813cb0c7486fc701" + integrity sha512-Km2mWHKKY5GzRg6i1j5OxOHQtuvVsgskLfigG25yTtbyfRGn/GNvIbRyOf1PSCKJ2aT/58TiuUsuOU5UToVViw== dependencies: chokidar "^3.5.2" debug "^3.2.7" ignore-by-default "^1.0.1" - minimatch "^3.0.4" + minimatch "^3.1.2" pstree.remy "^1.1.8" semver "^5.7.1" simple-update-notifier "^1.0.7" @@ -3604,12 +3629,12 @@ nodemon@^2.0.19: touch "^3.1.0" undefsafe "^2.0.5" -nopt@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88" - integrity sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ== +nopt@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-6.0.0.tgz#245801d8ebf409c6df22ab9d95b65e1309cdb16d" + integrity sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g== dependencies: - abbrev "1" + abbrev "^1.0.0" nopt@~1.0.10: version "1.0.10" @@ -4118,19 +4143,19 @@ postcss@^7.0.16: picocolors "^0.2.1" source-map "^0.6.1" -postcss@^8.4.14: - version "8.4.14" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.14.tgz#ee9274d5622b4858c1007a74d76e42e56fd21caf" - integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig== +postcss@^8.4.20: + version "8.4.20" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.20.tgz#64c52f509644cecad8567e949f4081d98349dc56" + integrity sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g== dependencies: nanoid "^3.3.4" picocolors "^1.0.0" source-map-js "^1.0.2" -prettier@^2.7.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" - integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== +prettier@^2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.1.tgz#4e1fd11c34e2421bc1da9aea9bd8127cd0a35efc" + integrity sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg== pretty-bytes@^5.6.0: version "5.6.0" @@ -4598,10 +4623,10 @@ rxjs@^7.5.1: dependencies: tslib "^2.1.0" -rxjs@~7.5.5: - version "7.5.5" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.5.tgz#2ebad89af0f560f460ad5cc4213219e1f7dd4e9f" - integrity sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw== +rxjs@~7.8.0: + version "7.8.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4" + integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== dependencies: tslib "^2.1.0" @@ -4632,10 +4657,10 @@ safe-stable-stringify@^2.3.1: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sass@^1.53.0: - version "1.54.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.54.0.tgz#24873673265e2a4fe3d3a997f714971db2fba1f4" - integrity sha512-C4zp79GCXZfK0yoHZg+GxF818/aclhp9F48XBu/+bm9vXEVAYov9iU3FBVRMq3Hx3OA4jfKL+p2K9180mEh0xQ== +sass@^1.57.1: + version "1.57.1" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.57.1.tgz#dfafd46eb3ab94817145e8825208ecf7281119b5" + integrity sha512-O2+LwLS79op7GI0xZ8fqzF7X2m/m8WFfI02dHOdsK5R2ECeS5F62zrwg/relM1rjSLy7Vd/DiMNIvPrQGsA0jw== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -4711,10 +4736,10 @@ shadow-cljs-jar@1.3.2: resolved "https://registry.yarnpkg.com/shadow-cljs-jar/-/shadow-cljs-jar-1.3.2.tgz#97273afe1747b6a2311917c1c88d9e243c81957b" integrity sha512-XmeffAZHv8z7451kzeq9oKh8fh278Ak+UIOGGrapyqrFBB773xN8vMQ3O7J7TYLnb9BUwcqadKkmgaq7q6fhZg== -shadow-cljs@2.20.2: - version "2.20.2" - resolved "https://registry.yarnpkg.com/shadow-cljs/-/shadow-cljs-2.20.2.tgz#24a4b204f1f2288dc4ff2d0a4f3972a6e5307645" - integrity sha512-2kzWnV1QM6KBetziCAkCf8BJdnDX2CwiAr4yhvOsiQpaNJcMzwMsJTX/gTHz58yQg0dV5uwPsIyBlvyIfl30rg== +shadow-cljs@2.20.16: + version "2.20.16" + resolved "https://registry.yarnpkg.com/shadow-cljs/-/shadow-cljs-2.20.16.tgz#32e83586fcc91a246b7fb622349135ad84ca1a19" + integrity sha512-k33ssZppDkBSYIfKswiKOX/8bNTnHbHoTmwf3KBPXBQkDPptPR3FeedmWtS5vKWnucFTe9DObhM2exKocErIxw== dependencies: node-libs-browser "^2.2.1" readline-sync "^1.4.7" @@ -5380,10 +5405,10 @@ ua-parser-js@^0.7.18: resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.31.tgz#649a656b191dffab4f21d5e053e27ca17cbff5c6" integrity sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ== -ua-parser-js@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.2.tgz#e2976c34dbfb30b15d2c300b2a53eac87c57a775" - integrity sha512-00y/AXhx0/SsnI51fTc0rLRmafiGOM4/O+ny10Ps7f+j/b8p/ZY11ytMgznXkOVo4GQ+KwQG5UQLkLGirsACRg== +ua-parser-js@^1.0.32: + version "1.0.32" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.32.tgz#786bf17df97de159d5b1c9d5e8e9e89806f8a030" + integrity sha512-dXVsz3M4j+5tTiovFVyVqssXBu5HM47//YSOeZ9fQkdDKkfzv2v3PP1jmH6FUyPW+yCSn7aBVK1fGGKNhowdDA== unbox-primitive@^1.0.1: version "1.0.1" @@ -5472,10 +5497,10 @@ upath@^1.1.1: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== -update-browserslist-db@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.4.tgz#dbfc5a789caa26b1db8990796c2c8ebbce304824" - integrity sha512-jnmO2BEGUjsMOe/Fg9u0oczOe/ppIDZPebzccl1yDWGLFP16Pa1/RM5wEoKYPG2zstNcDuAStejyxsOuKINdGA== +update-browserslist-db@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== dependencies: escalade "^3.1.1" picocolors "^1.0.0"