Fork me on GitHub

I'm trying to get pathom 3 to build with the latest rev but keep getting a null pointer exception when it tries to put together the classpath. The older (7 months ago) git sha:

{:paths ["src"]
   {:git/url ""
    :sha "1f3ca76ead855609e0f27b30f6e8bf23b5bcfa0a"}}}
works and produces:
$ clj -X:deps tree 
org.clojure/clojure 1.10.3
  . org.clojure/spec.alpha 0.2.194
  . org.clojure/core.specs.alpha 0.2.56
com.wsscode/pathom3  1f3ca76
  . com.fulcrologic/guardrails 0.0.12
    . com.taoensso/timbre 4.10.0
      . com.taoensso/encore 2.91.0
        X org.clojure/tools.reader 0.10.0 :superseded
        . com.taoensso/truss 1.5.0
      . io.aviso/pretty 0.1.33
    . expound/expound 0.7.2
  . com.wsscode/async 1.0.8
    . org.clojure/core.async 1.1.587
      . org.clojure/tools.analyzer.jvm 1.0.0
        . org.clojure/tools.analyzer 1.0.0
        . org.clojure/core.memoize 0.8.2
          . org.clojure/core.cache 0.8.2
            . org.clojure/data.priority-map 0.0.7
        . org.ow2.asm/asm 5.2
        . org.clojure/tools.reader 1.3.2 :newer-version
  . com.wsscode/cljc-misc  66ba288
  . edn-query-language/eql 1.0.0
    X org.clojure/spec.alpha 0.2.176 :older-version
    X org.clojure/core.specs.alpha 0.2.44 :older-version
  . potemkin/potemkin 0.4.5
    . clj-tuple/clj-tuple 0.2.2
    . riddley/riddley 0.1.12
but the latest git sha:
{:paths ["src"]
       {:git/url ""
        :sha "354574f6a4fbd30e54c85fa41d5bf2eb7de59a39"}}}
doesn't work, it produces:
$ clj -X:deps tree 
    Error generating tree: 
       at clojure.lang.MultiFn.invoke(
       at java.util.concurrent.ThreadPoolExecutor.runWorker(
       at java.util.concurrent.ThreadPoolExecutor$
When I'm inside pathom3 project, all is well, it's just when I include it as a dependency this happens. Any ideas?


hello @U0CGFT70T, I just tried to reproduce, but running on latest pathom sha I get the correct tree output


any chance some other dep may be conflicting? can you try in a bare project (just clojrue and pathom as deps) and see the error remains?


thx @U066U8JQJ I tried that...the deps.edn I show is the complete deps.edn file. I have other computers...I'll try on them and see if is somehow environmental?


When I try to clj-jack-in with cider I get the additional warnings: (which may just be red herrings of

error in process sentinel:
nrepl-server-sentinel: Could not start nREPL server:
DEPRECATED: Libs must be qualified,
change refactor-nrepl => refactor-nrepl/refactor-nrepl 
WARNING: Specified aliases are undeclared: [:dev]
Error building classpath. 
	at clojure.lang.MultiFn.invoke(
	at java.util.concurrent.ThreadPoolExecutor.runWorker(
	at java.util.concurrent.ThreadPoolExecutor$

Jakub Holý (HolyJak)18:05:11

🙏 I discovered my understanding of Pathom 2 is lacking. I have a global resolver with ::pc/output {:teams [...]} and an empty input (and Pathom can see it, as per the screenshot) yet when I query for [:teams] I get back {:teams :com.wsscode.pathom.core/not-found} . What am I doing wrong? I expected the whole output of the resolver to be returned... .

Jakub Holý (HolyJak)18:05:01

solved, the output lacked the [...] : ::pc/output [ {:teams [...]} ] .

👍 7
Tomas Brejla08:05:29

I bumped into the same problem in the past as well. I wonder what's the expected contract here. Should you always provide all those keys "promised in pc/output" in output map and therefore return at least :teams [] in case no teams actually exist in your db? If so, perhaps some sort of key-presence validation (or clj-kondo rule?) could be added to avoid mistakes like the mentioned one?

Jakub Holý (HolyJak)18:05:15

Another question: I am getting ::pc/reader-error with the message ":address/id is not ISeqable" when I query for a person's :address . The global resolver returns data containing: ... :address [:address/id 1] and I expect it to follow up with the other, ident resolver to get the actual data. Instead, I get the error above. Why?

Jakub Holý (HolyJak)18:05:41

These are all my resolvers:

(defresolver my-very-awesome-teams [_ _] ; a global resolver
      {::pc/input  #{}
       ::pc/output [{:teams [:team/id :team/name
                             {:team/players [:player/id :player/name :player/address]}]}]}
      {:teams [#:team{:name "Hikers" :id :hikers
                      :players [#:player{:id 1 :name "Luna" :address [:address/id 1]}
                                #:player{:id 2 :name "Sol" :address [:address/id 2]}]}]})

    (defresolver address [_ {id :address/id :as in}] ; an ident resolver
      {::pc/input #{:address/id}
       ::pc/output [:address/id :address/city]}
      (println "RES address" in)
      (case id
        1 #:address{:id 1 :city "Oslo"}
        2 #:address{:id 2 :city "Trondheim"}))

Jakub Holý (HolyJak)18:05:07

The ident resolver works, as [{[:address/id 1] [:address/city]}] is correctly parsed into {[:address/id 1] {:address/city "Oslo"}} .

Jakub Holý (HolyJak)19:05:33

If I change the data so that a player has a list of addresses instead of a single one (=> :address [[:address/id 1]]) then it works. But surely I should be able to have to-one references? What am I misunderstanding or doing wrong?

Jakub Holý (HolyJak)19:05:20

Solved it, I was mixing up Fulcro ident's and Pathom's idea of identity. The correct value was :address {:address/id 1} , i.e. an entity with just the ID.


just seeing your messages now, glad you got it figured out 🙂

👍 3

I'm still new to Pathom. I'd like to use my resolvers to fill in the missing values of an entity I already have and wasn't able to figure it out from the docs. Something like this:

(def data
  {:first "Alyssa"
   :last "Hacker"
   :friends [{:first "Ben"
              :last "Bitdiddle"}
             {:first "Louis"
              :last "Reasoner"}]})
(parser {} [:first :full {:friends [:first :full]}])
=> {:first "Alyssa"
    :full "Alyssa Hacker"
    :friends [{:first "Ben"
               :full "Ben Bitdiddle"}
              {:first "Louis"
               :full "Louis Reasoner"}]}
I think I can skip the ident lookup by omitting pc/open-ident-reader, but how do I pass in the initial data? Also, a more general question, is this still a reasonable use of pathom?


hello, welcome 🙂 to pass the data directly you can use:

(parser {::p/entity (atom DATA)} [:first :full ...]}


Indeed--that works beautifully! Thank you!

👍 3