All Projects → VerachadW → Kraph

VerachadW / Kraph

Licence: mit
GraphQL request string builder written in Kotlin

Programming Languages

kotlin
9241 projects

Labels

Projects that are alternatives of or similar to Kraph

Relay Rails Blog
A graphql, relay and standard rails application powered demo weblog. We are using Graphql server and relay for our react component data needs.
Stars: ✭ 140 (-3.45%)
Mutual labels:  graphql
Gh Latest Repos
Microservice to get the latest public GitHub repos from a user
Stars: ✭ 143 (-1.38%)
Mutual labels:  graphql
Githunt Angular
An Apollo with Angular full-stack example app: vote for your favorite GitHub repos!
Stars: ✭ 144 (-0.69%)
Mutual labels:  graphql
Awesome Hasura
A curated list of awesome things relating to the hasura ecosystem.
Stars: ✭ 141 (-2.76%)
Mutual labels:  graphql
Graphlient
Ruby GraphQL Client
Stars: ✭ 142 (-2.07%)
Mutual labels:  graphql
Amplify Photo Sharing Workshop
Building full-stack cloud apps with AWS Amplify and React
Stars: ✭ 143 (-1.38%)
Mutual labels:  graphql
Typegraphql Prisma
Prisma 2 generator to emit TypeGraphQL types and CRUD resolvers from your Prisma 2 schema
Stars: ✭ 137 (-5.52%)
Mutual labels:  graphql
Micro Graphql
GraphQL Microservice
Stars: ✭ 145 (+0%)
Mutual labels:  graphql
Openship
e-commerce automation
Stars: ✭ 143 (-1.38%)
Mutual labels:  graphql
Typescript Expo Apollo Boilerplate
Clean boilerplate for TypeScript + Expo (React Native) + React Apollo (GraphQL)
Stars: ✭ 144 (-0.69%)
Mutual labels:  graphql
Ra Data Opencrud
A react-admin data provider for Prisma and GraphCMS
Stars: ✭ 142 (-2.07%)
Mutual labels:  graphql
Graphql Directive
Use custom directives in your GraphQL schema and queries 🎩
Stars: ✭ 142 (-2.07%)
Mutual labels:  graphql
Practical Dapr
A full-stack .NET microservices build on Dapr and Tye
Stars: ✭ 140 (-3.45%)
Mutual labels:  graphql
Project Webcube
Continuously updated JS infrastructure for modern web dev
Stars: ✭ 141 (-2.76%)
Mutual labels:  graphql
Nest User Auth
A starter build for a back end which implements managing users with MongoDB, Mongoose, NestJS, Passport-JWT, and GraphQL.
Stars: ✭ 145 (+0%)
Mutual labels:  graphql
Reason Apollo Hooks
Deprecated in favor of https://github.com/reasonml-community/graphql-ppx
Stars: ✭ 140 (-3.45%)
Mutual labels:  graphql
Absinthe relay
Absinthe support for the Relay framework
Stars: ✭ 143 (-1.38%)
Mutual labels:  graphql
Meteor Apollo Accounts
Meteor accounts in GraphQL
Stars: ✭ 145 (+0%)
Mutual labels:  graphql
Captain Fact Api
🔎 CaptainFact - API. The one that serves and process all the data for https://captainfact.io
Stars: ✭ 145 (+0%)
Mutual labels:  graphql
Gatsby Source Prismic Graphql
Gatsby source plugin for Prismic GraphQL
Stars: ✭ 144 (-0.69%)
Mutual labels:  graphql

Kraph Build Status Download codecov

In short, this is a GraphQL request JSON body builder for Kotlin. It will generate the JSON string for request body that work with GraphQL Server. For example, we have this GraphQL query to list all notes:

query {
    notes {
        id
        createdDate
        content
        author {
            name
            avatarUrl(size: 100)
        }
    }
}

Which is written in Kotlin using Kraph like this:

Kraph {
    query {
        fieldObject("notes") {
            field("id")
            field("createdDate")
            field("content")
            fieldObject("author") {
                field("name")
                field("avatarUrl", mapOf("size" to 100))
            }
        }
    }
}

As you can see, we can achieve our goal with just a few tweaks from the original query.

NOTE: Kraph is still in an early stage. The usage may change in further development.

Features

  • DSL builder style. Make it easier to read and use.
  • Support Cursor Connection and Input Object Mutation in Relay.

Set up

Adding Kraph to build.gradle

repositories {
    jcenter()
}

dependencies {
    compile "me.lazmaid.kraph:kraph:x.y.z"
}

Guide

If you are not familiar with GraphQL syntax, it is recommended to read the GraphQL introduction for an overview of how Graphql works. Usually, you should be able to use queries from other tools (e.g. GraphiQL) with a few tweaks. First, let's see what Kraph provides for you.

Simple GraphQL

  • query and mutation represents the Query and Mutation operations of GraphQL. The name of the query or mutaton can be passed as a string.

    GraphQL:

    query GetUsers {
      ...
    }
    

    Kraph:

    Kraph {
        query("GetUsers") {
            ...
        }
    }
    

    GraphQL:

    mutation UpdateUserProfile {
      ...
    }
    

    Kraph:

    Kraph {
        mutation("UpdateUserProfile") {
            ...
        }
    }
    
  • field and fieldObject represent accessors for fields. Though there are technically no differences, fieldObject may be chosen for clarity to indicate that a field must contain another set of nested fields as an argument. Both of them take a Map<String, Any> that maps Kotlin data types to the GraphQL data types for input objects. You can also specify an alias using alias to change the name of the returned field.

    query {
      users {
        nick: name
        email
        avatarUrl(size: 100)
      }
    }
    
    Kraph {
        query {
            fieldObject("users") {
                field("name", alias = "nick")
                field("email")
                field("avatarUrl", args = mapOf("size" to 100))
            }
        }
    }
    
  • fragment provides a mechanism for creating GraphQL Fragments. To use a fragment in a query requires two steps. The first is to define the fragment, letting Kraph know how to handle it later:

    fragment UserFragment on User {
      name
      email
      avatarUrl(size: 100)
    }
    
    Kraph.defineFragment("UserFragment") {
        field("name")
        field("email")
        field("avatarUrl", mapOf("size" to 100))
    }
    

    Then, when you are creating your query, you can simply use the fragment and its fields will be expanded:

    query {
      users {
        ...UserFragment
      }
    }
    
  • fragment provides a mechanism for creating GraphQL Fragments. To use a fragment in a query requires two steps. The first is to define the fragment, letting Kraph know how to handle it later:

    fragment UserFragment on User {
      name
      email
      avatarUrl(size: 100)
    }
    
    Kraph.defineFragment("UserFragment") {
        field("name")
        field("email")
        field("avatarUrl", mapOf("size" to 100))
    }
    

    Then, when you are creating your query, you can simply use the fragment and its fields will be expanded:

    query {
      users {
        ...UserFragment
      }
    }
    
    Kraph {
        query("GetUsers") {
            fieldObject("users") {
                fragment("UserFragment")
            }
        }
    }
    

Relay

  • func represents a Field inside a Mutation block that follows the Relay Input Object Mutations specification.
    mutation {
      userLogin(input: {email: "[email protected]", password: "abcd1234"}) {
        accessToken
        user {
          id
          email
        }
      }
    }
    
    Kraph {
        mutation {
            func("userLogin", input = mapOf("email" to "[email protected]", "password" to "abcd1234")) {
                field("accessToken")
                fieldObject("user") {
                    field("id")
                    field("email")
                }
            }
        }
    }
    
  • cursorConnection represents a Field that follows the Relay Cursor Connections specification
    query {
       users(first: 10, after: "user::1234") {
        edges {
          node {
            id
            name
          }
        }
      }
    }
    
    Kraph {
        cursorConnection("users", first = 10, after = "user::1234") {   
            edges {
                node {
                    field("id")
                    field("name")
                }
            }
        }
    }
    

Request/Query String

  • toRequestString() will generate a JSON body to send in POST request.
  • toGraphQueryString() will give you the formatted GraphQL string. This is very useful for debugging.
    val query = Kraph {
        query {
            fieldObject("users") {
                field("name")
                field("email")
                field("avatarUrl", args = mapOf("size" to 100))
            }
        }
    }    
    
    println(query.toRequestString())
    /*
     * Result:
     * {"query": "query {\nnotes {\nid\ncreatedDate\ncontent\nauthor {\nname\navatarUrl(size: 100)\n}\n}\n}", "variables": null, "operationName": null}
     */
    println(query.toGraphQueryString())
    /*
     * Result:
     * query {
     *   notes {
     *     id
     *     createdDate
     *     content
     *     author {
     *       name
     *       avatarUrl(size: 100)
     *     }
     *   }
     * }
     */
    
  • requestQueryString(), requestVariableString() and requestOperationName() provide more fine grained access to the components of the full request string, which are sometimes necessary depending on your HTTP request builder and GraphQL server setup. They provide the values for the query, variables, and operationName parameters, respectively, and so are good for creating GET requests. Please note that requestVariableString() will always return null until variable support is implemented.

Contributing to Kraph

We use Github issues for tracking bugs and requests. Any feedback and/or PRs is welcome.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].