Vincit/venia

Sequence of type ChunkedSeq leads to invalid query from graphql-query

Opened this issue · 1 comments

When passing a sequence to the graphql-query function this leads to different behaviour whether the sequence is a ChunkedSeq or an IndexedSeq.

Example

(require '[venia.core :refer [graphql-query]])

(def indexed-seq
  (seq (mapv (comp keyword str) (take 10 (range)))))
;; => (:0 :1 :2 :3 :4 :5 :6 :7 :8 :9)

(type indexed-seq)
;; => cljs.core/IndexedSeq

(graphql-query
 {:queries [[:foo {:bar indexed-seq}]]})
;; => "{foo(bar:[0,1,2,3,4,5,6,7,8,9])}"

(def chunked-seq
  (seq (mapv (comp keyword str) (take 40 (range)))))
;; => (:0 :1 :2 :3 :4 :5 :6 :7 :8 :9 :10 ... :39)

(type chunked-seq)
;; => cljs.core/ChunkedSeq

(graphql-query
 {:queries [[:foo {:bar chunked-seq}]]})
;; => "{foo(bar:(:0 :1 :2 :3 :4 :5 :6 :7 :8 :9 :10 ... :39))}"

So when the sequence is longer and thus Clojure internally handles it as a ChunkedSeq instead of an IndexedSeq, the collection in the arguments is processed to become a list with keywords, instead of a vector with symbols. In the ChunkedSeq case the query generated is invalid GraphQL.

Workaround

Ensure the sequence passed to graphql-query is not of type ChunkedSeq, for example by marshalling the sequence into a vector.

Note: this is a crosspost of district0x/graphql-query#9.

Reason is that the protocol is extended to an IndexedSeq at https://github.com/Vincit/venia/blob/master/src/venia/core.cljc#L53, but not to a ChunkedSeq.