diff --git a/common/src/app/common/schema.cljc b/common/src/app/common/schema.cljc index 494b1df2a7..641837f53d 100644 --- a/common/src/app/common/schema.cljc +++ b/common/src/app/common/schema.cljc @@ -316,6 +316,22 @@ (let [v (if (string? v) (str/split v #"[\s,]+") v)] (into #{} non-empty-strings-xf v)))}}) +(def! ::set-of-keywords + {:type ::set-of-keywords + :pred #(and (set? %) (every? keyword? %)) + :type-properties + {:title "set[string]" + :description "Set of Strings" + :error/message "should be a set of strings" + :gen/gen (-> :keyword sg/generator sg/set) + ::oapi/type "array" + ::oapi/format "set" + ::oapi/items {:type "string" :format "keyword"} + ::oapi/unique-items true + ::oapi/decode (fn [v] + (let [v (if (string? v) (str/split v #"[\s,]+") v)] + (into #{} (comp non-empty-strings-xf (map keyword)) v)))}}) + (def! ::set-of-emails {:type ::set-of-emails :pred #(and (set? %) (every? string? %)) diff --git a/exporter/src/app/config.cljs b/exporter/src/app/config.cljs index 6b9b469254..c219857d03 100644 --- a/exporter/src/app/config.cljs +++ b/exporter/src/app/config.cljs @@ -9,14 +9,15 @@ (:require ["process" :as process] [app.common.data :as d] + [app.common.flags :as flags] + [app.common.pprint :as pp] + [app.common.schema :as sm] [app.common.spec :as us] [app.common.version :as v] [cljs.core :as c] - [cljs.pprint] - [cljs.spec.alpha :as s] [cuerdas.core :as str])) -(def defaults +(def ^:private defaults {:public-uri "http://localhost:3449" :tenant "default" :host "localhost" @@ -24,22 +25,19 @@ :http-server-host "0.0.0.0" :redis-uri "redis://redis/0"}) -(s/def ::http-server-port ::us/integer) -(s/def ::http-server-host ::us/string) -(s/def ::public-uri ::us/uri) -(s/def ::tenant ::us/string) -(s/def ::host ::us/string) -(s/def ::browser-pool-max ::us/integer) -(s/def ::browser-pool-min ::us/integer) +(def ^:private schema:config + [:map {:title "config"} + [:public-uri {:optional true} ::sm/uri] + [:host {:optional true} :string] + [:tenant {:optional true} :string] + [:flags {:optional true} ::sm/set-of-keywords] + [:redis-uri {:optional true} :string] + [:browser-pool-max {:optional true} :int] + [:browser-pool-min {:optional true} :int]]) -(s/def ::config - (s/keys :opt-un [::public-uri - ::host - ::tenant - ::http-server-port - ::http-server-host - ::browser-pool-max - ::browser-pool-min])) +(defn- parse-flags + [config] + (flags/parse (:flags config))) (defn- read-env [prefix] @@ -58,24 +56,30 @@ (defn- prepare-config [] - (try - (let [env (read-env "penpot") - env (d/without-nils env) - data (merge defaults env)] - (us/conform ::config data)) - (catch :default cause - (js/console.log (us/pretty-explain (ex-data cause))) - (throw cause)))) + (let [env (read-env "penpot") + env (d/without-nils env) + data (merge defaults env) + data (sm/decode schema:config data sm/default-transformer)] + + (when-not (sm/validate schema:config data) + (pp/pprint (-> (sm/explain-data schema:config data) + (sm/humanize))) + (process/exit -1)) + + data)) (def config - (atom (prepare-config))) + (prepare-config)) (def version - (atom (v/parse "%version%"))) + (v/parse "%version%")) + +(def flags + (parse-flags config)) (defn get "A configuration getter." ([key] - (c/get @config key)) + (c/get config key)) ([key default] - (c/get @config key default))) + (c/get config key default))) diff --git a/exporter/src/app/core.cljs b/exporter/src/app/core.cljs index 29455bec2e..6d30b9220d 100644 --- a/exporter/src/app/core.cljs +++ b/exporter/src/app/core.cljs @@ -21,7 +21,7 @@ [& _] (l/info :msg "initializing" :public-uri (str (cf/get :public-uri)) - :version (:full @cf/version)) + :version (:full cf/version)) (p/do! (bwr/init) (redis/init) diff --git a/exporter/src/app/http.cljs b/exporter/src/app/http.cljs index e0d4921294..acfb6e909d 100644 --- a/exporter/src/app/http.cljs +++ b/exporter/src/app/http.cljs @@ -172,7 +172,8 @@ (.listen server port) (l/info :hint "welcome to penpot" :module "exporter" - :version (:full @cf/version)) + :flags cf/flags + :version (:full cf/version)) (l/info :hint "starting http server" :port port) (reset! instance server))) diff --git a/exporter/src/app/renderer/svg.cljs b/exporter/src/app/renderer/svg.cljs index ba3287a644..729b57fb48 100644 --- a/exporter/src/app/renderer/svg.cljs +++ b/exporter/src/app/renderer/svg.cljs @@ -10,6 +10,7 @@ [app.browser :as bw] [app.common.data :as d] [app.common.logging :as l] + [app.common.svg :as svg] [app.common.uri :as u] [app.config :as cf] [app.util.mime :as mime] @@ -316,7 +317,11 @@ ;; SVG standard don't allow the entity ;; nbsp.   is equivalent but compatible ;; with SVG. - result (str/replace result " " " ")] + result (str/replace result " " " ") + + result (if (contains? cf/flags :exporter-svgo) + (svg/optimize result) + result)] ;; (println "------- ORIGIN:") ;; (cljs.pprint/pprint (xml->clj xmldata))