浏览代码

fix: incorrect return values when edn parsing fails for queries

safe-read-string assumed all parsed strings were maps by returning {}
on failure. This could lead to subtle bugs in our new query layer and
other non-map features like hiccup
Gabriel Horner 1 年之前
父节点
当前提交
30a652631d

+ 12 - 0
deps/common/src/logseq/common/util.cljs

@@ -225,6 +225,7 @@
       false)))
 
 (defn safe-read-string
+  "Reads an edn string and returns nil if it fails to parse"
   ([content]
    (safe-read-string {} content))
   ([opts content]
@@ -234,6 +235,17 @@
        (log/error :parse/read-string-failed e)
        {}))))
 
+(defn safe-read-map-string
+  "Reads an edn map string and returns {} if it fails to parse"
+  ([content]
+   (safe-read-map-string {} content))
+  ([opts content]
+   (try
+     (reader/read-string opts content)
+     (catch :default e
+       (log/error :parse/read-string-failed e)
+       {}))))
+
 ;; Copied from Medley
 ;; https://github.com/weavejester/medley/blob/d1e00337cf6c0843fb6547aadf9ad78d981bfae5/src/medley/core.cljc#L22
 (defn dissoc-in

+ 1 - 1
deps/graph-parser/src/logseq/graph_parser/extract.cljc

@@ -306,7 +306,7 @@
    - blocks will be adapted to tldraw shapes. All blocks's parent is the given page."
   [file content {:keys [verbose] :or {verbose true}}]
   (let [_ (when verbose (println "Parsing start: " file))
-        {:keys [pages blocks]} (common-util/safe-read-string content)
+        {:keys [pages blocks]} (common-util/safe-read-map-string content)
         blocks (map
                 (fn [block]
                   (-> block

+ 3 - 3
src/main/frontend/components/block.cljs

@@ -443,7 +443,7 @@
 (defn image-link [config url href label metadata full_text]
   (let [metadata (if (string/blank? metadata)
                    nil
-                   (common-util/safe-read-string metadata))
+                   (common-util/safe-read-map-string metadata))
         title (second (first label))
         repo (state/get-current-repo)]
     (ui/catch-error
@@ -1150,7 +1150,7 @@
 (defn- show-link?
   [config metadata s full-text]
   (let [media-formats (set (map name config/media-formats))
-        metadata-show (:show (common-util/safe-read-string metadata))
+        metadata-show (:show (common-util/safe-read-map-string metadata))
         format (get-in config [:block :block/format])]
     (or
      (and
@@ -3636,7 +3636,7 @@
 
       ["Custom" "query" _options _result content]
       (try
-        (let [query (common-util/safe-read-string content)]
+        (let [query (common-util/safe-read-map-string content)]
           (query/custom-query (wrap-query-components config) query))
         (catch :default e
           (log/error :read-string-error e)

+ 1 - 1
src/main/frontend/handler/editor.cljs

@@ -3359,7 +3359,7 @@
                  (string/includes? content "#+END_QUERY"))
         (let [ast (mldoc/->edn (string/trim content) (or (:block/format entity) :markdown))
               q (mldoc/extract-first-query-from-ast ast)]
-          (some? (:query (common-util/safe-read-string q))))))))
+          (some? (:query (common-util/safe-read-map-string q))))))))
 
 (defn collapsable?
   ([block-id]

+ 1 - 1
src/main/frontend/handler/paste.cljs

@@ -105,7 +105,7 @@
                                           "web application/logseq"))))
           blocks-str (when blocks-blob (.text blocks-blob))]
          (when blocks-str
-           (common-util/safe-read-string blocks-str))))
+           (common-util/safe-read-map-string blocks-str))))
 
 (defn- markdown-blocks?
   [text]

+ 1 - 1
src/main/frontend/handler/whiteboard.cljs

@@ -342,7 +342,7 @@
   []
   (p/let [^js res (js/fetch "./whiteboard/onboarding.edn") ;; do we need to cache it?
           text (.text res)
-          edn (common-util/safe-read-string text)]
+          edn (common-util/safe-read-map-string text)]
     edn))
 
 (defn clone-whiteboard-from-edn