A workaround to make default linting resolve `dumdom.core/defcomponent` without complaints.
February 18, 2024 ยท View on GitHub
(ns my-dumdom.macros (:require [dumdom.core :as dumdom]))
(defn- extract-docstr [[docstr? & forms]] (if (string? docstr?) [docstr? forms] ["" (cons docstr? forms)]))
(defn- extract-opts ([[argvec ?opts & forms]] (assert (vector? argvec)) (if (map? ?opts) [?opts (cons argvec forms)] [{} (list* argvec ?opts forms)])))
(defmacro defcomponent
"A workaround to make default linting resolve defcomponent without complaints.
Instead of this: (defcomponent Widget "A Widget" :on-mount #(...) :on-render #(...) [value constant-value] (some-child-components))
We can write this: (defcomponent Widget [value constant-value] {:name "A Widget" :on-mount #(...) :on-render #(...)} (some-child-components))" [name & forms] (let [[docstr forms] (extract-docstr forms) [options forms] (extract-opts forms) [argvec & body] forms options (merge {:name (str (:name (:ns &env)) "/" name)} options)] `(def ~name ~docstr (dumdom.core/component (fn ~argvec ~@body) ~options))))