Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions deps.edn
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{:path ["src"]
:deps {org.clojure/clojure {:mvn/version "1.9.0"}
org.clojure/clojurescript {:mvn/version "1.10.339"}
alumbra/parser {:mvn/version "0.1.7"}
camel-snake-kebab {:mvn/version "0.4.1"}}}
2 changes: 1 addition & 1 deletion src/graphql_builder/generators/composed_mutation.cljc
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
mutation (make-mutation mutation-name composition-parts)]
(fn op-fn
([] (op-fn {}))
([vars]
([& vars]
(let [namespaced-vars (composed-query/namespace-vars prefixes vars)]
{:graphql {:operationName mutation-name
:query mutation
Expand Down
17 changes: 10 additions & 7 deletions src/graphql_builder/generators/composed_query.cljc
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,10 @@
(defn query-variables [composition-parts]
(let [variables (remove nil? (map :variables (vals composition-parts)))]
(when (seq variables)
(str "(" (str/join ", " variables) ")"))))
(str "(" (str/join "," variables) ")"))))

(defn make-query [query-name composition-parts]
(-> [(str "query " query-name (query-variables composition-parts) " {")
(-> [(str "query " query-name (query-variables composition-parts) "{")
(map :children (vals composition-parts))
"}"]
flatten
Expand All @@ -45,10 +45,13 @@
[(str (get prefixes query-key) "__" key) var])

(defn namespace-vars [prefixes vars]
(reduce (fn [acc [query-key vars]]
(let [prepared (util/variables->graphql vars)]
(reduce (fn [acc entry]
(let [query-key (ffirst entry)
vareables (-> entry first second)
prepared (util/variables->graphql vareables)]
(merge acc (into {} (map #(namespace-var prefixes query-key %) prepared)))))
{} vars))
{}
vars))

(defn make-unpack [prefixes]
(fn [data]
Expand All @@ -60,15 +63,15 @@
{} data)))

(defn generate [visitor queries nodes]
(let [query-name "ComposedQuery"
(let [query-name "ComposedQuery"
prefixes (make-prefixes queries)
query-nodes (make-query-nodes nodes queries)
composition-parts (make-composition-parts visitor query-nodes prefixes)
add-variables (query-variables composition-parts)
query (make-query query-name composition-parts)]
(fn op-fn
([] (op-fn {}))
([vars]
([& vars]
(let [namespaced-vars (namespace-vars prefixes vars)]
{:graphql {:operationName query-name
:query query
Expand Down
2 changes: 1 addition & 1 deletion src/graphql_builder/generators/field.cljc
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
(let [name (:name node)
field-name (:field-name node)]
(if name
(str name ": " field-name)
(str name ":" field-name)
field-name)))

(defn generate [visitor deps config indent-level node]
Expand Down
2 changes: 1 addition & 1 deletion src/graphql_builder/generators/inline_fragment.cljc
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
(str "..." (:name node) (fragment-type-name node) (directives node config)))

(defn open-block [node]
(when (has-children? node) " {"))
(when (has-children? node) "{"))

(defn close-block [node indent-level]
(when (has-children? node) (util/indent indent-level "}")))
Expand Down
4 changes: 2 additions & 2 deletions src/graphql_builder/generators/operation.cljc
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@

(defn node-variables-body [node config]
(when-let [variables (:variable-definitions node)]
(str/join ", " (map #(str "$" (variable-name % config) ": " (variable-value %)) variables))))
(str/join "," (map #(str "$" (variable-name % config) ":" (variable-value %)) variables))))

(defn node-variables [node config]
(when (:variable-definitions node)
Expand Down Expand Up @@ -55,7 +55,7 @@

(defn generate [visitor deps config indent-level node]
[(util/indent indent-level
(str (operation-name node) (node-variables node config) " {"))
(str (operation-name node) (node-variables node config) "{"))
(visitor deps config (inc indent-level) (children node config))
(util/indent indent-level "}")])

Expand Down
14 changes: 7 additions & 7 deletions src/graphql_builder/generators/shared.cljc
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,9 @@
(defn generate-arg-list [args]
(str "{"
(->> args
(mapv (fn [v] (str (:field-name v) ": " (generate-arg (:value v)))))
(str/join ", "))
"}"))
(mapv (fn [v] (str (:field-name v) ":" (generate-arg (:value v)))))
(str/join ","))
"}"))

(defn parse-arg [v]
(cond
Expand All @@ -51,7 +51,7 @@

(defn object-default-value [value]
(str "{ "
(str/join ", " (map (fn [v] (str (:name v) ": " (parse-arg (:value v)))) value))
(str/join "," (map (fn [v] (str (:name v) ":" (parse-arg (:value v)))) value))
" }"))

(defn get-enum-or-string-value [argument]
Expand All @@ -65,7 +65,7 @@
(let [value (:value argument)
value-type (:value-type argument)]
(cond
(:values value) (str "[" (str/join ", " (map get-enum-or-string-value (:values value))) "]")
(:values value) (str "[" (str/join "," (map get-enum-or-string-value (:values value))) "]")
(and (vector? value) (= :object-value (first value))) (object-default-value (last value))
:else (get-enum-or-string-value argument))))

Expand All @@ -89,7 +89,7 @@
(defn node-arguments [node config]
(when-let [arguments (:arguments node)]
(str "("
(str/join ", " (map #(str (:argument-name %) ": " (argument-value % config)) arguments))
(str/join "," (map #(str (:argument-name %) ":" (argument-value % config)) arguments))
")")))

(defn directive [d config]
Expand All @@ -107,7 +107,7 @@
(boolean (seq (:selection-set node))))

(defn open-block [node]
(when (has-children? node) " {"))
(when (has-children? node) "{"))

(defn close-block [node indent-level]
(when (has-children? node) (util/indent indent-level "}")))
3 changes: 2 additions & 1 deletion src/graphql_builder/parser.cljs
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
(ns graphql-builder.parser)
(ns graphql-builder.parser
(:require-macros [graphql-builder.parser]))
2 changes: 1 addition & 1 deletion src/graphql_builder/util.cljc
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

(defn nl-join [coll]
(when (seq coll)
(str/join "\n" (vec (remove nil? coll)))))
(str/join "" (vec (remove nil? coll)))))

(defn indent [level line]
(str (str/join "" (repeat (* 2 level) " ")) line))
Expand Down
50 changes: 31 additions & 19 deletions test/graphql_builder/core_test.clj
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,40 @@
[graphql-builder.util :refer [nl-join variables->graphql]]
[graphql-builder.parser :refer [parse defgraphql]]))

(def composed-query-source-2 "
query Hero($episode: String!) {
hero(episode: $episode) {
name
}
}
")

(def composed-mutation-source "
mutation AddStarship($name: String!){
addStarship(name: $name){
id
}
}")

(def test-statements (map str/trim (edn/read-string (slurp "test/graphql_builder/resources/statements.edn"))))

(deftest generate-test
;;test if we can recreate the same GraphQL source
(doseq [test-statement test-statements]
(is (= test-statement
(core/generated->graphql (core/generate (parse test-statement)))))))
(testing "if we can recreate the same graphql source"
(doseq [test-statement test-statements]
(is (= test-statement
(core/generated->graphql (core/generate (parse test-statement)))))))
(testing "several arguments can be apply to composed query"
(let [composed-fn (core/composed-query (parse composed-query-source-2)
{:jedi-hero "Hero"
:empire-hero "Hero"})
composed-query (composed-fn {:empire-hero {:episode "EMPIRE"}} {:jedi-hero {:episode "JEDI"}})]
(is (= 2 (count (get-in composed-query [:graphql :variables]))))))
(testing "several arguments can be apply to composed mutation"
(let [composed-fn (core/composed-mutation (parse composed-mutation-source)
{:add-starship-1 "AddStarship"
:add-starship-2 "AddStarship"})
composed-mutation (composed-fn {:add-starship-1 {:name "asd"}} {:add-starship-2 {:name "dsa"}})]
(is (= 2 (count (get-in composed-mutation [:graphql :variables])))))))

(def inline-fragment-source "
query LoadStarships($starshipCount: Int!) {
Expand Down Expand Up @@ -301,14 +328,6 @@ query ComposedQuery($LoadStarships1__starshipCount: Int!, $LoadStarships2__stars
(is (= {:load-starships-1 {"foo" :bar}}
(unpack {"LoadStarships1__foo" :bar})))))

(def composed-query-source-2 "
query Hero($episode: String!) {
hero(episode: $episode) {
name
}
}
")

(def composed-query-result-2 "
query ComposedQuery($JediHero__episode: String!, $EmpireHero__episode: String!) {
JediHero__hero: hero(episode: $JediHero__episode) {
Expand Down Expand Up @@ -828,13 +847,6 @@ query Foo {
(is (= (str/trim object-argument-parsing-source-2)
(get-in (query-fn) [:graphql :query])))))

(def composed-mutation-source "
mutation AddStarship($name: String!){
addStarship(name: $name){
id
}
}")

(def composed-mutation-result "
mutation ComposedMutation($AddStarship1__name: String!, $AddStarship2__name: String!) {
AddStarship1__addStarship: addStarship(name: $AddStarship1__name) {
Expand Down