Browse Source

enhance(dev): add linters for db-sync

Fix minor kondo errors. Also removed obvious dead code found by carve linter
Gabriel Horner 1 week ago
parent
commit
cd7c1ef50e

+ 29 - 1
.github/workflows/deps-db-sync.yml

@@ -65,4 +65,32 @@ jobs:
         run: yarn install --frozen-lockfile
 
       - name: Run unit tests
-        run: yarn test:node-adapter
+        run: yarn test:node-adapter
+
+  lint:
+    runs-on: ubuntu-latest
+
+    steps:
+      - name: Checkout
+        uses: actions/checkout@v4
+
+      - name: Set up Java
+        uses: actions/setup-java@v4
+        with:
+          distribution: 'zulu'
+          java-version: ${{ env.JAVA_VERSION }}
+
+      - name: Set up Clojure
+        uses: DeLaGuardo/[email protected]
+        with:
+          cli: ${{ env.CLOJURE_VERSION }}
+          bb: ${{ env.BABASHKA_VERSION }}
+
+      - name: Run clj-kondo lint
+        run: clojure -M:clj-kondo --lint src test
+
+      - name: Carve lint for unused vars
+        run: bb lint:carve
+
+      - name: Lint for vars that are too large
+        run: bb lint:large-vars

+ 24 - 0
deps/db-sync/.carve/ignore

@@ -0,0 +1,24 @@
+;; API
+logseq.db-sync.cycle/fix-cycle!
+;; API
+logseq.db-sync.node.entry/main
+;; API
+logseq.db-sync.order/fix-duplicate-orders!
+;; TODO: is this ns needed?
+logseq.db-sync.platform.cloudflare/response
+logseq.db-sync.platform.cloudflare/request
+logseq.db-sync.platform.cloudflare/request-url
+;; testing
+logseq.db-sync.protocol/tx->transit
+;; debugging
+logseq.db-sync.protocol/datoms->wire
+;; debugging
+logseq.db-sync.protocol/datoms->wire
+;; debugging
+logseq.db-sync.sentry.node/capture-exception!
+;; Used?
+logseq.db-sync.snapshot/framed-length
+;; API
+logseq.db-sync.worker/worker
+;; debugging
+logseq.db-sync.worker.timing/summary

+ 13 - 3
deps/db-sync/.clj-condo/config.edn

@@ -10,9 +10,19 @@
              clojure.string string
              datascript.core d
              datascript.transit dt
-             logseq.publish.common publish-common
-             logseq.publish.model publish-model}}}
+             logseq.db-sync.common common
+             logseq.db-sync.config config
+             logseq.db-sync.node.routes node-routes
+             logseq.db-sync.platform.core platform
+             logseq.db-sync.protocol protocol
+             logseq.db-sync.storage storage
+             logseq.db-sync.worker.auth auth
+             logseq.db-sync.worker.handler.sync sync-handler
+             logseq.db-sync.worker.handler.ws ws-handler
+             logseq.db-sync.worker.http http
+             logseq.db-sync.worker.routes.index routes
+             logseq.db-sync.worker.ws ws}}}
  :lint-as {promesa.core/let clojure.core/let
            shadow.cljs.modern/defclass clj-kondo.lint-as/def-catch-all}
  :skip-comments true
- :output {:progress true}}
+ :output {:progress true}}

+ 28 - 0
deps/db-sync/bb.edn

@@ -0,0 +1,28 @@
+{:min-bb-version "1.0.168"
+ :deps
+ {logseq/bb-tasks
+  #_{:local/root "../../../bb-tasks"}
+  {:git/url "https://github.com/logseq/bb-tasks"
+   :git/sha "70d3edeb287f5cec7192e642549a401f7d6d4263"}}
+
+ :pods
+ {clj-kondo/clj-kondo {:version "2024.09.27"}}
+
+ :tasks
+ {lint:large-vars
+  logseq.bb-tasks.lint.large-vars/-main
+
+  lint:carve
+  logseq.bb-tasks.lint.carve/-main
+
+  lint:ns-docstrings
+  logseq.bb-tasks.lint.ns-docstrings/-main
+
+  lint:minimize-public-vars
+  logseq.bb-tasks.lint.minimize-public-vars/-main}
+
+ :tasks/config
+ {:large-vars
+  {:metadata-exceptions #{:large-vars/cleanup-todo}
+   ;; AI generated code has its tradeoffs
+   :max-lines-count 110}}}

+ 0 - 14
deps/db-sync/src/logseq/db_sync/common.cljs

@@ -4,8 +4,6 @@
             [logseq.db.sqlite.util :as sqlite-util]
             [promesa.core :as p]))
 
-(def text-decoder (js/TextDecoder.))
-
 (defn cors-headers []
   #js {"Access-Control-Allow-Origin" "*"
        "Access-Control-Allow-Headers" "content-type,content-encoding,authorization,x-amz-meta-checksum,x-amz-meta-type"
@@ -25,18 +23,6 @@
 (defn options-response []
   (platform/response nil #js {:status 204 :headers (cors-headers)}))
 
-(defn bad-request [message]
-  (json-response {:error message} 400))
-
-(defn unauthorized []
-  (json-response {:error "unauthorized"} 401))
-
-(defn forbidden []
-  (json-response {:error "forbidden"} 403))
-
-(defn not-found []
-  (json-response {:error "not found"} 404))
-
 (defn get-sql-rows [^js result]
   (let [iter-fn (when result (aget result js/Symbol.iterator))]
     (cond

+ 0 - 58
deps/db-sync/src/logseq/db_sync/compare.cljs

@@ -1,58 +0,0 @@
-(ns logseq.db-sync.compare
-  (:require [datascript.core :as d]
-            [datascript.impl.entity :as de]
-            [goog.crypt.Sha256]
-            [logseq.db.common.normalize :refer [eid->lookup]]))
-
-(def ^:private compare-attrs
-  #{:block/uuid
-    :block/parent
-    :block/page
-    :block/title})
-
-(defn filter-applied-tx-data
-  [{:keys [db-after db-before tx-data]}]
-  (->> tx-data
-       (keep
-        (fn [[e a v _t added]]
-          (when (contains? compare-attrs a)
-            (let [op (if added :db/add :db/retract)
-                  e' (or (eid->lookup db-before e)
-                         (eid->lookup db-after e))
-                  v' (if (and (integer? v)
-                              (pos? v)
-                              (or (= :db.type/ref (:db/valueType (d/entity db-after a)))
-                                  (= :db.type/ref (:db/valueType (d/entity db-before a)))))
-                       (or (eid->lookup db-before v) (eid->lookup db-after v))
-                       v)]
-              [op e' a v']))))
-       ;; e has been added and retracted in the batched tx data, so that we can ignore it
-       (remove (fn [[_op e]] (nil? e)))
-       set))
-
-(defn filter-received-tx-data
-  [{:keys [tempids db-before db-after] :as report} tx-data]
-  (->> tx-data
-       (mapcat
-        (fn [[op e a v]]
-          (if (= op :db/retractEntity)
-            (let [entity (d/entity db-before e)]
-              (keep
-               (fn [a]
-                 (let [v (get entity a)
-                       v' (if (de/entity? v) [:block/uuid (:block/uuid v)] v)]
-                   (when v'
-                     [:db/retract [:block/uuid (:block/uuid entity)] a v'])))
-               compare-attrs))
-            (when (contains? compare-attrs a)
-              (let [e' (if (neg-int? e)
-                         (when-let [id (:block/uuid (d/entity db-after (get tempids e)))]
-                           [:block/uuid id])
-                         e)
-                    v' (if (neg-int? v)
-                         (when-let [id (:block/uuid (d/entity db-after (get tempids v)))]
-                           [:block/uuid id])
-                         v)]
-                [[op e' a v']])))))
-       (remove (fn [[_op e]] (nil? e)))
-       set))

+ 2 - 2
deps/db-sync/src/logseq/db_sync/logging.cljs

@@ -1,9 +1,9 @@
 (ns logseq.db-sync.logging
-  (:require [lambdaisland.glogi :as glogi]
+  (:require [lambdaisland.glogi :as log]
             [lambdaisland.glogi.console :as glogi-console]))
 
 (defn install!
   "Installs console logging and sets the root logger level to `:info`."
   []
   (glogi-console/install!)
-  (glogi/set-level :glogi/root :info))
+  (log/set-level :glogi/root :info))

+ 2 - 2
deps/db-sync/src/logseq/db_sync/platform/core.cljs

@@ -9,5 +9,5 @@
   (js/Request. url init))
 
 (defn request-url
-  [request]
-  (js/URL. (.-url request)))
+  [request']
+  (js/URL. (.-url request')))

+ 2 - 0
deps/db-sync/src/logseq/db_sync/worker.cljs

@@ -1,4 +1,6 @@
 (ns logseq.db-sync.worker
+  ;; Turn off false defclass errors
+  {:clj-kondo/config {:linters {:unresolved-symbol {:level :off}}}}
   (:require ["cloudflare:workers" :refer [DurableObject]]
             [lambdaisland.glogi :as log]
             [logseq.db-sync.common :as common]

+ 1 - 1
deps/db-sync/src/logseq/db_sync/worker/handler/index.cljs

@@ -13,7 +13,7 @@
       (log/error :db-sync/index-db-missing {:binding "DB"}))
     db))
 
-(defn handle [{:keys [db ^js env request url claims route]}]
+(defn ^:large-vars/cleanup-todo handle [{:keys [db ^js env request url claims route]}]
   (let [path-params (:path-params route)
         graph-id (:graph-id path-params)
         member-id (:member-id path-params)

+ 2 - 0
deps/db-sync/test/logseq/db_sync/node_adapter_test.cljs

@@ -1,4 +1,6 @@
 (ns logseq.db-sync.node-adapter-test
+  ;; Linters disabled because commented out FIXME code causes false positives
+  {:clj-kondo/config {:ignore true}}
   (:require [cljs.test :refer [deftest is async testing]]
             [clojure.string :as string]
             [logseq.db-sync.node.server :as node-server]