README.md 5.8 KB
Newer Older
1 2
# GraphQL Codegen Gradle plugin #

3
![Build](https://github.com/kobylynskyi/graphql-java-codegen/workflows/Build/badge.svg)
B
Bogdan Kobylynskyi 已提交
4
[![Gradle Plugins](https://img.shields.io/maven-metadata/v/https/plugins.gradle.org/m2/io/github/kobylynskyi/graphql-java-codegen-gradle-plugin/maven-metadata.xml.svg?label=gradle)](https://plugins.gradle.org/plugin/io.github.kobylynskyi.graphql.codegen)
5 6
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)

7 8 9 10 11 12 13 14 15 16 17
* [Description](#description)
* [Plugin Setup](#plugin-setup)
* [Plugin Options](#plugin-options)
* [Sample Plugin Configuration](#sample-plugin-configuration)
  * [External mapping configuration](#external-mapping-configuration)
* [Examples](#examples)
  * [GraphQL **server** code generation](#graphql-server-code-generation)
  * [GraphQL **client** code generation](#graphql-client-code-generation)
* [Different configurations for graphql schemas](#different-configurations-for-graphql-schemas)
* [Convert generated Java classes to Kotlin classes](#convert-generated-java-classes-to-kotlin-classes)

18 19 20 21 22 23

### Description

This Gradle plugin is able to generate the following classes based on your GraphQL schema:
* Interfaces for GraphQL queries, mutations and subscriptions
* Interfaces for GraphQL unions
24 25 26 27 28
* POJO classes for GraphQL types/inputs
* Enum classes for GraphQL enums
* Interface Resolvers for GraphQL type fields
* Client Request classes for GraphQL queries, mutations and subscriptions

29 30 31 32 33

### Plugin Setup

```groovy
plugins {
34
  id "io.github.kobylynskyi.graphql.codegen" version "1.7.4"
35 36 37 38 39 40 41 42 43 44 45 46 47
}
```

Using [legacy plugin application](https://docs.gradle.org/current/userguide/plugins.html#sec:old_plugin_application):

```groovy
buildscript {
  repositories {
    maven {
      url "https://plugins.gradle.org/m2/"
    }
  }
  dependencies {
48
    classpath "io.github.kobylynskyi.graphql.codegen:graphql-codegen-gradle-plugin:1.7.4"
49 50 51 52 53 54
  }
}

apply plugin: "io.github.kobylynskyi.graphql.codegen"
```

55 56
### Plugin Options

57
Please refer to [Codegen Options](../../docs/codegen-options.md)
58 59

### Sample Plugin Configuration
60 61 62 63 64 65 66 67

#### build.gradle:

```groovy
graphqlCodegen {
    graphqlSchemaPaths = [
        "$projectDir/src/main/resources/schema.graphqls".toString()
    ]
68
    outputDir = new File("$buildDir/generated")
69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
    packageName = "com.example.graphql.model"
    customTypesMapping = [
        DateTime: "org.joda.time.DateTime",
        Price.amount: "java.math.BigDecimal"
    ]
    customAnnotationsMapping = [
        DateTime: "com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = com.example.json.EpochMillisScalarDeserializer.class"
    ]
    modelNameSuffix = "TO"
}

// Automatically generate GraphQL code on project build:
compileJava.dependsOn 'graphqlCodegen'

// Add generated sources to your project source sets:
sourceSets.main.java.srcDir "$buildDir/generated"
```

87 88
You can also refer to build.gradle files in example projects: [example-client/build.gradle](example-client/build.gradle), [example-server/build.gradle](example-server/build.gradle)

89 90 91 92 93
#### build.gradle.kts:

```groovy
tasks.named<GraphqlCodegenGradleTask>("graphqlCodegen") {
    graphqlSchemaPaths = listOf("$projectDir/src/main/resources/graphql/schema.graphqls".toString())
94
    outputDir = new File("$buildDir/generated")
95 96 97 98 99 100 101
    packageName = "com.example.graphql.model"
    customTypesMapping = mutableMapOf(Pair("EpochMillis", "java.time.LocalDateTime"))
    customAnnotationsMapping = mutableMapOf(Pair("EpochMillis", "com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = com.example.json.EpochMillisScalarDeserializer.class"))
}

// Automatically generate GraphQL code on project build:
sourceSets {
102
    getByName("main").java.srcDirs("$buildDir/generated")
103 104 105 106 107 108 109 110 111
}

// Add generated sources to your project source sets:
val check: DefaultTask by tasks
val graphqlCodegen: DefaultTask by tasks
check.dependsOn(graphqlCodegen)    
```


112 113
### Examples

114 115 116
#### GraphQL **server** code generation

[example-server](example-server):
117 118
  * [Plugin configuration in build.gradle](example-server/build.gradle)
  * [GraphQL Resolver classes that implement generated interfaces](example-server/src/main/java/io/github/kobylynskyi/product/graphql/resolvers)
119 120 121 122

#### GraphQL **client** code generation 

[example-client](example-client):
123 124 125 126 127 128
  * [Plugin configuration in build.gradle](example-client/build.gradle)
  * [Building GraphQL request and parsing response using Spring RestTemplate](example-client/src/main/java/io/github/kobylynskyi/order/external/ProductServiceGraphQLClient.java)
  * [Building GraphQL request and parsing response using RestAssured](example-client/src/test/java/io/github/kobylynskyi/order/service/CreateProductIntegrationTest.java)


### Different configurations for graphql schemas
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145

If you want to have different configuration for different `.graphqls` files (e.g.: different javaPackage, outputDir, etc.), then you will need to create separate gradle tasks for each set of schemas. E.g.:

```groovy
task graphqlCodegenService1(type: GraphqlCodegenGradleTask) {
    graphqlSchemaPaths = ["$projectDir/src/main/resources/schema1.graphqls".toString()]
    outputDir = new File("$buildDir/generated/example1")
}

task graphqlCodegenService2(type: GraphqlCodegenGradleTask) {
    graphqlSchemaPaths = ["$projectDir/src/main/resources/schema2.graphqls".toString()]
    outputDir = new File("$buildDir/generated/example2")
}
```

Later on you can call each task separately or together:

146 147 148
* `gradle clean graphqlCodegenService1 build`
* `gradle clean graphqlCodegenService2 build`
* `gradle clean graphqlCodegenService1 graphqlCodegenService2 build`
149 150 151 152


### Convert generated Java classes to Kotlin classes

153 154
1. Navigate in IntelliJ IDEA to the `./build/generated/graphql/` folder and press `Cmd+Alt+Shift+K`
2. Access generated classes as normal Kotlin classes.
155 156 157 158 159 160


### Inspired by

[swagger-codegen](https://github.com/swagger-api/swagger-codegen)