Skip to content

Instantly share code, notes, and snippets.

@gmp26
Last active December 28, 2023 14:23
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gmp26/2d2a8fafa0650c80af5d79c8e2929c34 to your computer and use it in GitHub Desktop.
Save gmp26/2d2a8fafa0650c80af5d79c8e2929c34 to your computer and use it in GitHub Desktop.
clj-kondo config for fulcro, mount and pathom2. WIP
;
; Put this under .clj-kondo in the project folder. Includes some fulcro, mount, pathom22, nubank workspaces,
; and fulcro-rad config.
;
{:hooks {:analyze-call {com.fulcrologic.fulcro.mutations/defmutation com.fulcrologic.fulcro.clj-kondo-hooks/defmutation
com.fulcrologic.guardrails.core/>defn com.fulcrologic.fulcro.clj-kondo-hooks/>defn}}
:linters {:clj-kondo.fulcro.defmutation/handler-arity {:level :error}
:clj-kondo.fulcro.>defn/signature-mismatch {:level :error}}
:lint-as {;com.fulcrologic.fulcro.mutations/defmutation clojure.core/def
nubank.workspaces.core/defcard clojure.core/def
com.fulcrologic.fulcro.networking.websockets/stop! clojure.core/def
com.fulcrologic.fulcro.components/defsc clojure.core/defn
com.fulcrologic.fulcro.routing.dynamic-routing/defrouter clojure.core/defn
com.fulcrologic.fulcro.ui-state-machines/defstatemachine clojure.core/def
com.fulcrologic.guardrails.core/>def clojure.core/def
com.fulcrologic.guardrails.core/>defn clojure.core/defn
com.fulcrologic.rad.attributes/defattr clojure.core/def
com.fulcrologic.rad.report/defsc-report clojure.core/defn
com.fulcrologic.rad.form/defsc-form clojure.core/defn
com.fulcrologic.rad.authorization/defauthenticator clojure.core/def
com.wsscode.pathom.connect/defmutation clojure.core/defn
com.wsscode.pathom.connect/defresolver clojure.core/defn
com.wsscode.async.async-clj/deftest-async clojure.test/deftest
com.wsscode.async.async-clj/go-try-stream clojure.core/let
com.wsscode.async.async-clj/let-chan clojure.core/let
com.wsscode.async.async-clj/let-chan* clojure.core/let
com.wsscode.async.async-cljs/deftest-async clojure.test/deftest
com.wsscode.async.async-cljs/go-try-stream clojure.core/let
com.wsscode.async.async-cljs/let-chan clojure.core/let
com.wsscode.async.async-cljs/let-chan* clojure.core/let}}
;
; Path to this file should be .clj-kondo/com/fulcrologic/fulcro/com/fulcro/clj-kondo-hooks.clj
;
(ns com.fulcrologic.fulcro.clj-kondo-hooks
(:require [clj-kondo.hooks-api :as api]))
(defn defmutation
[{:keys [node]}]
(let [args (rest (:children node))
mutation-name (first args)
?docstring (when (string? (api/sexpr (second args)))
(second args))
args (if ?docstring
(nnext args)
(next args))
params (first args)
handlers (rest args)
handler-syms (map (comp first :children) handlers)
bogus-usage (api/vector-node (vec handler-syms))
letfn-node (api/list-node
(list
(api/token-node 'letfn)
(api/vector-node (vec handlers))
bogus-usage))
new-node (api/list-node
(list
(api/token-node 'defn)
mutation-name
params
letfn-node))]
(doseq [handler handlers]
(let [hname (some-> handler :children first api/sexpr str)
argv (some-> handler :children second)]
(when-not (= 1 (count (api/sexpr argv)))
(api/reg-finding! (merge
(meta argv)
{:message (format "defmutation handler '%s' should be a fn of 1 arg" hname)
:type :clj-kondo.fulcro.defmutation/handler-arity})))))
{:node new-node}))
(defn >defn
[{:keys [node]}]
(let [args (rest (:children node))
fn-name (first args)
?docstring (when (string? (api/sexpr (second args)))
(second args))
args (if ?docstring
(nnext args)
(next args))
argv (first args)
gspec (second args)
body (nnext args)
new-node (api/list-node
(list*
(api/token-node 'defn)
fn-name
argv
gspec
body))]
(when (not= (count (api/sexpr argv))
(count (take-while #(not= '=> %) (api/sexpr gspec))))
(api/reg-finding! (merge (meta gspec)
{:message "Guardrail spec does not match function signature"
:type :clj-kondo.fulcro.>defn/signature-mismatch})))
{:node new-node}))
@jplaza
Copy link

jplaza commented Sep 21, 2022

Thank you @gmp26 !

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment