diff --git a/deps.edn b/deps.edn new file mode 100644 index 0000000..dd22308 --- /dev/null +++ b/deps.edn @@ -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"}}} diff --git a/src/graphql_builder/generators/composed_mutation.cljc b/src/graphql_builder/generators/composed_mutation.cljc index ac5fdff..e1de012 100644 --- a/src/graphql_builder/generators/composed_mutation.cljc +++ b/src/graphql_builder/generators/composed_mutation.cljc @@ -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 diff --git a/src/graphql_builder/generators/composed_query.cljc b/src/graphql_builder/generators/composed_query.cljc index af1c01e..00baadd 100644 --- a/src/graphql_builder/generators/composed_query.cljc +++ b/src/graphql_builder/generators/composed_query.cljc @@ -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 @@ -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] @@ -60,7 +63,7 @@ {} 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) @@ -68,7 +71,7 @@ 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 diff --git a/src/graphql_builder/generators/field.cljc b/src/graphql_builder/generators/field.cljc index a5490a3..eeccd01 100644 --- a/src/graphql_builder/generators/field.cljc +++ b/src/graphql_builder/generators/field.cljc @@ -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] diff --git a/src/graphql_builder/generators/inline_fragment.cljc b/src/graphql_builder/generators/inline_fragment.cljc index c19d0e9..33f0f84 100644 --- a/src/graphql_builder/generators/inline_fragment.cljc +++ b/src/graphql_builder/generators/inline_fragment.cljc @@ -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 "}"))) diff --git a/src/graphql_builder/generators/operation.cljc b/src/graphql_builder/generators/operation.cljc index 3e784a8..07638cd 100644 --- a/src/graphql_builder/generators/operation.cljc +++ b/src/graphql_builder/generators/operation.cljc @@ -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) @@ -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 "}")]) diff --git a/src/graphql_builder/generators/shared.cljc b/src/graphql_builder/generators/shared.cljc index 9eae405..308d2ae 100644 --- a/src/graphql_builder/generators/shared.cljc +++ b/src/graphql_builder/generators/shared.cljc @@ -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 @@ -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] @@ -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)))) @@ -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] @@ -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 "}"))) diff --git a/src/graphql_builder/parser.cljs b/src/graphql_builder/parser.cljs index 27209a7..ec7a1e9 100644 --- a/src/graphql_builder/parser.cljs +++ b/src/graphql_builder/parser.cljs @@ -1 +1,2 @@ -(ns graphql-builder.parser) +(ns graphql-builder.parser + (:require-macros [graphql-builder.parser])) diff --git a/src/graphql_builder/util.cljc b/src/graphql_builder/util.cljc index 81d3f6d..f967f65 100644 --- a/src/graphql_builder/util.cljc +++ b/src/graphql_builder/util.cljc @@ -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)) diff --git a/test/graphql_builder/core_test.clj b/test/graphql_builder/core_test.clj index 1c2b3f1..06ea222 100644 --- a/test/graphql_builder/core_test.clj +++ b/test/graphql_builder/core_test.clj @@ -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!) { @@ -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) { @@ -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) {