在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称(OpenSource Name):Vincit/venia开源软件地址(OpenSource Url):https://github.com/Vincit/venia开源编程语言(OpenSource Language):Clojure 100.0%开源软件介绍(OpenSource Introduction):veniaA Clojure(Script) qraphql query client library. Generate valid graphql queries with Clojure data structures. UsageVenia is originally supposed to be used in Clojurescript apps, but can be used as well in Clojure, as the core is written in CLJC. The sole purpose of this library is graphql query string generation from Clojure data, so that strings concatenations and manipulations could be avoided when using grapqhl. It is up to developers to hook it up to frontend apps. However, at least some sort of re-frame-graphql-fx library is on a roadmap. Simple queryThe easiest way to start with venia, is simple's query generation. (ns my.project
(:require [venia.core :as v]))
(v/graphql-query {:venia/queries [[:employee {:id 1 :active true} [:name :address [:friends [:name :email]]]]]})
=> "{employee(id:1,active:true){name,address,friends{name,email}}}" Obviously, If we would like to fetch employees and projects within the same simple query, we would do it this way: (v/graphql-query {:venia/queries [[:employee {:id 1 :active true} [:name :address [:friends [:name :email]]]]
[:projects {:active true} [:customer :price]]]})
=> "{employee(active:true){name,address},project(active:true){customer,price}}" Field argumentsIn the example above, We can add arguments to other fields easily by wrapping field name and its arguments to vector (v/graphql-query {:venia/queries [[:projects {:active true} [[:customer {:id 2}] :price]]]})
=> "{project(active:true){customer(id:2),price}}" Query with aliasNow, if we need to have an alias for query, it can be easily achieved by using venia's query-with-data map (v/graphql-query {:venia/queries [{:query/data [:employee {:id 1 :active true} [:name :address [:friends [:name :email]]]]
:query/alias :workhorse}
{:query/data [:employee {:id 2 :active true} [:name :address [:friends [:name :email]]]]
:query/alias :boss}]})
=> prettified:
{
workhorse: employee(id: 1, active: true) {
name
address
},
boss: employee(id: 2, active: true) {
name
address
}
} In the query above, we use Query with fragmentsWhat about fragments? Just add (v/graphql-query {:venia/queries [{:query/data [:employee {:id 1 :active true} :fragment/comparisonFields]
:query/alias :workhorse}
{:query/data [:employee {:id 2 :active true} :fragment/comparisonFields]
:query/alias :boss}]
:venia/fragments [{:fragment/name "comparisonFields"
:fragment/type :Worker
:fragment/fields [:name :address]}]})
=> prettified:
{
workhorse: employee(id: 1, active: true) {
...comparisonFields
}
boss: employee(id: 2, active: true) {
...comparisonFields
}
}
fragment comparisonFields on Worker {
name
address
} Query with variablesNow you can generate really complex queries with variables as well. In order to define variables, we need to define an operation type and name. (v/graphql-query {:venia/operation {:operation/type :query
:operation/name "employeeQuery"}
:venia/variables [{:variable/name "id"
:variable/type :Int
:variable/default 1}
{:variable/name "name"
:variable/type :String}]
:venia/queries [{:query/data [:employee {:id :$id
:active true
:name :$name}
:fragment/comparisonFields]
:query/alias :workhorse}
{:query/data [:employee {:id :$id
:active false}
:fragment/comparisonFields]
:query/alias :boss}]
:venia/fragments [{:fragment/name "comparisonFields"
:fragment/type :Worker
:fragment/fields [:name :address [:friends [:name :email]]]}]})
=> prettified:
query employeeQuery($id: Int = 1, $name: String) {
workhorse: employee(id: $id, active: true, name: $name) {
...comparisonFields
}
boss: employee(id: $id, active: false) {
...comparisonFields
}
}
fragment comparisonFields on Worker {
name
address
friends {
name
email
}
}
MutationMutations are also supported, just use (v/graphql-query {:venia/operation {:operation/type :mutation
:operation/name "AddProjectToEmployee"}
:venia/variables [{:variable/name "id"
:variable/type :Int!}
{:variable/name "project"
:variable/type :ProjectNameInput!}]
:venia/queries [[:addProject {:employeeId :$id
:project :$project}
[:allocation :name]]]})
=> prettified:
mutation AddProjectToEmployee($id:Int!,$project:ProjectNameInput!) {
addProject(employeeId:$id, project:$project) {
allocation,
name
}
} ValidationVenia will verify that you don't use undefined variables or fragments. For example, the following (v/graphql-query {:venia/queries [[:employee {:id 1 :active true} :fragment/undefined]]}
(v/graphql-query {:venia/queries [[:employee {:id 1 :active :$undefined} [:name]]]})) because fragment and variable are never defined. Meta fieldsYou can use graphql's (v/graphql-query {:venia/queries [[:employee [:meta/typename :name :address]]}
=> prettified:
{
employee {
__typename,
name,
address
}
}
LicenseCopyright © 2017 Vincit Distributed under the Eclipse Public License, the same as Clojure. |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论