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))))