mirror of
https://github.com/penpot/penpot.git
synced 2025-01-06 14:50:20 -05:00
eaaff76aad
The exception is hidden on normal cli invocatin of clj-kondo and hapens when component with empty params is defined.
231 lines
8 KiB
Clojure
231 lines
8 KiB
Clojure
(ns hooks.export
|
|
(:require [clj-kondo.hooks-api :as api]))
|
|
|
|
(defn export
|
|
[{:keys [:node]}]
|
|
(let [[_ sname] (:children node)
|
|
result (api/list-node
|
|
[(api/token-node (symbol "def"))
|
|
(api/token-node (symbol (name (:value sname))))
|
|
sname])]
|
|
{:node result}))
|
|
|
|
(def registry (atom {}))
|
|
|
|
|
|
(defn potok-reify
|
|
[{:keys [:node :filename] :as params}]
|
|
(let [[rnode rtype & other] (:children node)
|
|
rsym (symbol (str "event-type-" (name (:k rtype))))
|
|
reg (get @registry filename #{})]
|
|
(when-not (:namespaced? rtype)
|
|
(let [{:keys [:row :col]} (meta rtype)]
|
|
(api/reg-finding! {:message "ptk/reify type should be namespaced"
|
|
:type :potok/reify-type
|
|
:row row
|
|
:col col})))
|
|
|
|
(if (contains? reg rsym)
|
|
(let [{:keys [:row :col]} (meta rtype)]
|
|
(api/reg-finding! {:message (str "duplicate type: " (name (:k rtype)))
|
|
:type :potok/reify-type
|
|
:row row
|
|
:col col}))
|
|
(swap! registry update filename (fnil conj #{}) rsym))
|
|
|
|
(let [result (api/list-node
|
|
(into [(api/token-node (symbol "deftype"))
|
|
(api/token-node rsym)
|
|
(api/vector-node [])]
|
|
other))]
|
|
|
|
;; (prn (api/sexpr result))
|
|
|
|
{:node result})))
|
|
|
|
(defn penpot-with-atomic
|
|
[{:keys [node]}]
|
|
(let [[params & body] (rest (:children node))]
|
|
(if (api/vector-node? params)
|
|
(let [[sym val opts] (:children params)]
|
|
(when-not (and sym val)
|
|
(throw (ex-info "No sym and val provided" {})))
|
|
{:node (api/list-node
|
|
(list*
|
|
(api/token-node 'let)
|
|
(api/vector-node [sym val])
|
|
opts
|
|
body))})
|
|
|
|
{:node (api/list-node
|
|
(into [(api/token-node 'let)
|
|
(api/vector-node [params params])]
|
|
body))})))
|
|
|
|
(defn rumext-fnc
|
|
[{:keys [node]}]
|
|
(let [[cname mdata params & body] (rest (:children node))
|
|
[params body] (if (api/vector-node? mdata)
|
|
[mdata (cons params body)]
|
|
[params body])
|
|
|
|
result (api/list-node
|
|
(into [(api/token-node 'fn) params]
|
|
(cons mdata body)))]
|
|
|
|
{:node result}))
|
|
|
|
|
|
(defn- parse-defc
|
|
[{:keys [children] :as node}]
|
|
(let [args (rest children)
|
|
|
|
[cname args]
|
|
(if (api/token-node? (first args))
|
|
[(first args) (rest args)]
|
|
(throw (ex-info "unexpected1" {})))
|
|
|
|
[docs args]
|
|
(if (api/string-node? (first args))
|
|
[(first args) (rest args)]
|
|
["" args])
|
|
|
|
[mdata args]
|
|
(if (api/map-node? (first args))
|
|
[(first args) (rest args)]
|
|
[(api/map-node []) args])
|
|
|
|
[params body]
|
|
(if (api/vector-node? (first args))
|
|
[(first args) (rest args)]
|
|
(throw (ex-info "unexpected2" {})))]
|
|
|
|
[cname docs mdata params body]))
|
|
|
|
(defn rumext-defc
|
|
[{:keys [node]}]
|
|
(let [[cname docs mdata params body] (parse-defc node)
|
|
|
|
param1 (first (:children params))
|
|
paramN (rest (:children params))
|
|
|
|
param1 (if (api/map-node? param1)
|
|
(let [param1 (into {} (comp
|
|
(partition-all 2)
|
|
(map (fn [[k v]]
|
|
[(if (api/keyword-node? k)
|
|
(:k k)
|
|
k)
|
|
(if (api/vector-node? v)
|
|
(vec (:children v))
|
|
v)])))
|
|
(:children param1))
|
|
|
|
binding (:rest param1)
|
|
param1 (if binding
|
|
(if (contains? param1 :as)
|
|
(update param1 :keys (fnil conj []) binding)
|
|
(assoc param1 :as binding))
|
|
param1)]
|
|
(->> (dissoc param1 :rest)
|
|
(mapcat (fn [[k v]]
|
|
[(if (keyword? k)
|
|
(api/keyword-node k)
|
|
k)
|
|
(if (vector? v)
|
|
(api/vector-node v)
|
|
v)]))
|
|
(api/map-node)))
|
|
param1)
|
|
|
|
result (api/list-node
|
|
(into [(api/token-node 'defn)
|
|
cname
|
|
(api/vector-node (filter some? (cons param1 paramN)))]
|
|
(cons mdata body)))]
|
|
|
|
;; (prn (api/sexpr result))
|
|
|
|
{:node result}))
|
|
|
|
|
|
(defn rumext-lazycomponent
|
|
[{:keys [node]}]
|
|
(let [[cname mdata params & body] (rest (:children node))
|
|
[params body] (if (api/vector-node? mdata)
|
|
[mdata (cons params body)]
|
|
[params body])]
|
|
(let [result (api/list-node [(api/token-node 'constantly) nil])]
|
|
;; (prn (api/sexpr result))
|
|
{:node result})))
|
|
|
|
|
|
(defn penpot-defrecord
|
|
[{:keys [:node]}]
|
|
(let [[rnode rtype rparams & other] (:children node)
|
|
|
|
nodes [(api/token-node (symbol "do"))
|
|
(api/list-node
|
|
(into [(api/token-node (symbol (name (:value rnode)))) rtype rparams] other))
|
|
(api/list-node
|
|
[(api/token-node (symbol "defn"))
|
|
(api/token-node (symbol (str "pos->" (:string-value rtype))))
|
|
(api/vector-node
|
|
(->> (:children rparams)
|
|
(mapv (fn [t]
|
|
(api/token-node (symbol (str "_" (:string-value t))))))))
|
|
(api/token-node nil)])]
|
|
|
|
result (api/list-node nodes)]
|
|
|
|
;; (prn "=====>" (into {} rparams))
|
|
;; (prn (api/sexpr result))
|
|
{:node result}))
|
|
|
|
(defn clojure-specify
|
|
[{:keys [:node]}]
|
|
(let [[rnode rtype & other] (:children node)
|
|
result (api/list-node
|
|
(into [(api/token-node (symbol "extend-type"))
|
|
(api/token-node (gensym (:string-value rtype)))]
|
|
other))]
|
|
{:node result}))
|
|
|
|
(defn service-defmethod
|
|
[{:keys [:node]}]
|
|
(let [[rnode rtype ?meta & other] (:children node)
|
|
rsym (gensym (name (:k rtype)))
|
|
|
|
[?docs other] (if (api/string-node? ?meta)
|
|
[?meta other]
|
|
[nil (cons ?meta other)])
|
|
|
|
[?meta other] (let [?meta (first other)]
|
|
(if (api/map-node? ?meta)
|
|
[?meta (rest other)]
|
|
[nil other]))
|
|
|
|
nodes [(api/token-node (symbol "do"))
|
|
(api/list-node
|
|
[(api/token-node (symbol "declare"))
|
|
(api/token-node rsym)])
|
|
|
|
(when ?docs
|
|
(api/list-node
|
|
[(api/token-node (symbol "comment")) ?docs]))
|
|
|
|
(when ?meta
|
|
(api/list-node
|
|
[(api/token-node (symbol "reset-meta!"))
|
|
(api/token-node rsym)
|
|
?meta]))
|
|
(api/list-node
|
|
(into [(api/token-node (symbol "defmethod"))
|
|
(api/token-node rsym)
|
|
rtype]
|
|
other))]
|
|
result (api/list-node (filterv some? nodes))]
|
|
|
|
;; (prn "=====>" rtype)
|
|
;; (prn (api/sexpr result))
|
|
{:node result}))
|