diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 31c9685ba..35ec20ccb 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -12,21 +12,25 @@ assignees: '' *Describe your bug in detail.* ## Steps to Reproduce + *List in detail the exact steps to reproduce the unexpected behavior.* ## Expected Result + *Explain in detail what behavior you expected to happen.* ## Actual Result + *Explain in detail what behavior actually happened.* ## Your Environment and Setup * **graphql-java-codegen version**: *X.X.X* * **Build tool**: *E.g.: Maven/Gradle/SBT* -* **Mapping Config**: *E.g.:* +* **Mapping Config**: *E.g.:* ```xml + ${project.build.directory}/generated-sources/graphql io.github.kobylynskyi.graphql.model diff --git a/.github/workflows/check-code-style.yml b/.github/workflows/check-code-style.yml new file mode 100644 index 000000000..77c5ac8b6 --- /dev/null +++ b/.github/workflows/check-code-style.yml @@ -0,0 +1,33 @@ +name: Check Code Style + +on: + push: + branches: + - master + - develop + pull_request: + branches: + - master + - develop + +jobs: + check-code-style: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Check Code Style + env: + WORKDIR: ./ + REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} + CHECKSTYLE_CONFIG: config/checkstyle/graphql-codegen-check-style.xml + REVIEWDOG_VERSION: v0.11.0 + run: | + wget -O - -q https://github.com/checkstyle/checkstyle/releases/download/checkstyle-8.41/checkstyle-8.41-all.jar > /opt/checkstyle.jar + wget -O - -q https://raw.githubusercontent.com/reviewdog/reviewdog/master/install.sh | sh -s -- -b /opt ${REVIEWDOG_VERSION} + java -jar /opt/checkstyle.jar "${WORKDIR}" -c "${CHECKSTYLE_CONFIG}" -f xml \ + | /opt/reviewdog -f=checkstyle \ + -reporter="${INPUT_REPORTER:-github-pr-check}" \ + -filter-mode="${INPUT_FILTER_MODE:-added}" \ + -fail-on-error="${INPUT_FAIL_ON_ERROR:-false}" diff --git a/.github/workflows/github.yml b/.github/workflows/github.yml index 8e27f8deb..4f6bc39fc 100644 --- a/.github/workflows/github.yml +++ b/.github/workflows/github.yml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - jdk-version: [1.8] + jdk-version: [ 1.8 ] steps: - uses: actions/checkout@v2 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 9ba085291..f89eb5fa5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -11,22 +11,24 @@ Before sending your pull requests, make sure you followed this list: - Build the project locally. - Run Unit Tests and ensure that you have the test coverage for your code. - ## Development process Please follow the steps below in order to make the changes: -1. Clone the repository and open it in your favourite IDE. +1. Clone the repository 2. Checkout **develop** branch. -3. Make code changes to the core library of `graphql-java-codegen`. -4. If changes are required in the plugin code, then **build** and **install** `graphql-java-codegen` first. +3. Open repository in your favourite IDE. +4. Enable and configure CheckStyle plugin in your IDE (for IntelliJ it is CheckStyle-IDEA). + Import [graphql-codegen-check-style.xml](config/checkstyle/graphql-codegen-check-style.xml) as a . +5. Make code changes to the core library of `graphql-java-codegen`. +6. If changes are required in the plugin code, then **build** and **install** `graphql-java-codegen` first. ```shell script # This will install the library (including your recent changes) in your local maven repository. ./gradlew clean build publishToMavenLocal ``` - -5. Build the plugin project with updated `graphql-java-codegen` library. + +7. Build the plugin project with updated `graphql-java-codegen` library. ```shell script # Build Gradle plugin @@ -37,8 +39,8 @@ Please follow the steps below in order to make the changes: mvn clean verify ``` -6. Make changes to the plugin code -7. Install the plugin (copy to your local maven repository). +8. Make changes to the plugin code +9. Install the plugin (copy to your local maven repository). ```shell script # Install Gradle plugin @@ -49,4 +51,4 @@ Please follow the steps below in order to make the changes: mvn clean install ``` -8. Make sure that `example` projects are compiling and running. +10. Make sure that `example` projects are compiling and running. diff --git a/build.gradle b/build.gradle index 8089b121e..7cffca83a 100644 --- a/build.gradle +++ b/build.gradle @@ -9,7 +9,7 @@ plugins { id "org.sonarqube" version "3.1.1" } -def graphqlCodegenVersion = '4.1.4' // This variable used in the automatic release process +def graphqlCodegenVersion = '4.1.5-SNAPSHOT' // This variable used in the automatic release process group = "io.github.kobylynskyi" version = graphqlCodegenVersion @@ -22,7 +22,7 @@ repositories { dependencies { implementation "org.freemarker:freemarker:2.3.31" implementation "com.graphql-java:graphql-java:15.0" - implementation "com.fasterxml.jackson.core:jackson-databind:2.12.2" + implementation "com.fasterxml.jackson.core:jackson-databind:2.12.1" testImplementation "org.junit.jupiter:junit-jupiter-api:5.7.1" testImplementation "org.junit.jupiter:junit-jupiter-params:5.7.1" diff --git a/config/checkstyle/checkstyle-suppressions.xml b/config/checkstyle/checkstyle-suppressions.xml new file mode 100644 index 000000000..309e98d63 --- /dev/null +++ b/config/checkstyle/checkstyle-suppressions.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/config/checkstyle/graphql-codegen-check-style.xml b/config/checkstyle/graphql-codegen-check-style.xml new file mode 100644 index 000000000..251683368 --- /dev/null +++ b/config/checkstyle/graphql-codegen-check-style.xml @@ -0,0 +1,363 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/client-side-cases-by-proxy.md b/docs/client-side-cases-by-proxy.md index ea6849341..c264d2694 100644 --- a/docs/client-side-cases-by-proxy.md +++ b/docs/client-side-cases-by-proxy.md @@ -1,20 +1,22 @@ ## Using dynamic proxy to implement client-side calls to GraphQL server -This is an example of using dynamic proxy to implement client-side call server, so in addition to generating code, -you almost do not need to write any code, only need to write a little code to call the server directly (This is a very small part of the method call code). +This is an example of using dynamic proxy to implement client-side call server, so in addition to generating code, you +almost do not need to write any code, only need to write a little code to call the server directly (This is a very small +part of the method call code). -However, since we have simplified the client-side logic as much as possible, this method is more used when exposed as an SDK, -so that the users do not need to choose the fields on projection. -This will also have a bad effect, we can only use all fields of the projection on the returned structure by default. -Moreover, we also need set to default the depth of nested queries so that the proxy can end smoothly. -All in all, the scenarios used are limited. Currently, `.. on` and `alias` are not supported. +However, since we have simplified the client-side logic as much as possible, this method is more used when exposed as an +SDK, so that the users do not need to choose the fields on projection. This will also have a bad effect, we can only use +all fields of the projection on the returned structure by default. Moreover, we also need set to default the depth of +nested queries so that the proxy can end smoothly. All in all, the scenarios used are limited. Currently, `.. on` +and `alias` are not supported. Here is only to provide a way, the specific implementation for reference only, not verified by production environment! > Because reflection is heavily used, don't consider this approach if you need high performance. - -1. First of all, we need to implement dynamic proxy, and be able to automatically add parameters to request and select return fields on projection. - + +1. First of all, we need to implement dynamic proxy, and be able to automatically add parameters to request and select + return fields on projection. + ```java import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLOperationRequest; @@ -77,8 +79,8 @@ final public class DynamicProxy implements InvocationHandler, ExecutionGraphql { /** * proxy invoke - *

- * when handle projection, we use reflect to invoke method directly + * + *

when handle projection, we use reflect to invoke method directly * but when handle request(need set parameters), we use reflect to get field which is a internal implementation of set method * * @param parentProjection @@ -193,7 +195,8 @@ final public class DynamicProxy implements InvocationHandler, ExecutionGraphql { } ``` -2. Then we need to be able to proxy any resolver implementation and enable users to call resolver methods through proxy objects. +2. Then we need to be able to proxy any resolver implementation and enable users to call resolver methods through proxy + objects. ```java @@ -430,7 +433,7 @@ object HumanResolverScalaApp extends App { ``` Here are some auxiliary codes, It depends on the different users. - + ```java public interface ExecutionGraphql { diff --git a/docs/codegen-options.md b/docs/codegen-options.md index 0396f8a65..d678b3ad4 100644 --- a/docs/codegen-options.md +++ b/docs/codegen-options.md @@ -28,9 +28,12 @@ | `modelValidationAnnotation` | String | `@javax.validation.`
`constraints.NotNull` | Annotation for mandatory (NonNull) fields. Can be null/empty. | | `typeResolverPrefix` | String | Empty | Sets the prefix for GraphQL type resolver classes. | | `typeResolverSuffix` | String | `Resolver` | Sets the suffix for GraphQL type resolver classes. | -| `customTypesMapping` | Map(String,String) | Empty | *See [CustomTypesMapping](#option-customtypesmapping)* | -| `customAnnotationsMapping` | Map(String,String[]) | Empty | *See [CustomAnnotationsMapping](#option-customannotationsmapping)* | -| `directiveAnnotationsMapping` | Map(String,String[]) | Empty | *See [DirectiveAnnotationsMapping](#option-directiveannotationsmapping)* | +| `customTypesMapping` | Map(String,String) | Empty | * +See [CustomTypesMapping](#option-customtypesmapping)* | +| `customAnnotationsMapping` | Map(String,String[]) | Empty | * +See [CustomAnnotationsMapping](#option-customannotationsmapping)* | +| `directiveAnnotationsMapping` | Map(String,String[]) | Empty | * +See [DirectiveAnnotationsMapping](#option-directiveannotationsmapping)* | | `fieldsWithResolvers` | Set(String) | Empty | Fields that require Resolvers should be defined here in format: `TypeName.fieldName` or `TypeName` or `@directive`. E.g.: `Person`, `Person.friends`, `@customResolver`. | | `fieldsWithoutResolvers` | Set(String) | Empty | Fields that DO NOT require Resolvers should be defined here in format: `TypeName.fieldName` or `TypeName` or `@directive`. Can be used in conjunction with `generateExtensionFieldsResolvers` option. E.g.: `Person`, `Person.friends`, `@noResolver`. | | `generateParameterizedFieldsR`
`esolvers` | Boolean | True | If true, then generate separate `Resolver` interface for parametrized fields. If false, then add field to the type definition and ignore field parameters. | @@ -54,8 +57,8 @@ ### Option `graphqlSchemas` -When exact paths to GraphQL schemas are too cumbersome to provide in the `graphqlSchemaPaths`, use the `graphqlSchemas` block. -The parameters inside that block are the following: +When exact paths to GraphQL schemas are too cumbersome to provide in the `graphqlSchemaPaths`, use the `graphqlSchemas` +block. The parameters inside that block are the following: | Key inside `graphqlSchemas` | Data Type | Default value | Description | | --------------------------- | ------------ | ------------------ | ----------- | @@ -64,29 +67,30 @@ The parameters inside that block are the following: | `includePattern` | String | `.*\.graphqls?` | A Java regex that file names must match to be included. It should be a regex as defined by the [Pattern](https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html) JDK class. It will be used to match only the file name without path. | | `excludedFiles` | Set | (empty set) | A set of files to exclude, even if they match the include pattern. These paths should be either absolute or relative to the provided `rootDir`. | - ### Option `ApiInterfaceStrategy` -Defines how to generate interfaces (resolvers) for each operation: `Query`/`Mutation`/`Subscription`. -Provides ability to skip generation of separate interface class for each operation in favor of having a single "root" interface (see *[ApiRootInterfaceStrategy](#option-apirootinterfacestrategy)* and *[ApiNamePrefixStrategy](#option-apinameprefixstrategy)*) +Defines how to generate interfaces (resolvers) for each operation: `Query`/`Mutation`/`Subscription`. Provides ability +to skip generation of separate interface class for each operation in favor of having a single "root" interface ( +see *[ApiRootInterfaceStrategy](#option-apirootinterfacestrategy)* +and *[ApiNamePrefixStrategy](#option-apinameprefixstrategy)*) | Value | Description | | --------------------------------------- | ----------- | | `INTERFACE_PER_OPERATION` **(default)** | Generate separate interface classes for each GraphQL operation. | | `DO_NOT_GENERATE` | Do not generate separate interfaces classes for GraphQL operation. | - ### Option `ApiRootInterfaceStrategy` -Defines how root interface (`QueryResolver` / `MutationResolver` / `SubscriptionResolver` will be generated (in addition to separate interfaces for each query/mutation/subscription) +Defines how root interface (`QueryResolver` / `MutationResolver` / `SubscriptionResolver` will be generated (in addition +to separate interfaces for each query/mutation/subscription) | Value | Description | | -------------------------------- | ----------- | | `INTERFACE_PER_SCHEMA` | Generate multiple super-interfaces for each graphql file.
Takes into account `apiNamePrefixStrategy`.
E.g.: `OrderServiceQueryResolver.java`, `ProductServiceQueryResolver.java`, etc. | -| `SINGLE_INTERFACE` **(default)** | Generate a single `QueryResolver.java`, `MutationResolver.java`, `SubscriptionResolver.java` for all graphql schema files. | +| `SINGLE_INTERFACE` **( +default)** | Generate a single `QueryResolver.java`, `MutationResolver.java`, `SubscriptionResolver.java` for all graphql schema files. | | `DO_NOT_GENERATE` | Do not generate super interface for GraphQL operations. | - ### Option `ApiNamePrefixStrategy` Defines which prefix to use for API interfaces. @@ -97,13 +101,23 @@ Defines which prefix to use for API interfaces. | `FOLDER_NAME_AS_PREFIX` | Will take parent folder name as a prefix for all generated API interfaces + value of `apiNamePrefix` config option. E.g.:
* following schemas: *resources/order-service/schema1.graphql*, *resources/order-service/schema2.graphql*
* will result in: `OrderServiceQueryResolver.java`, `OrderServiceGetOrderByIdQueryResolver.java`, etc | | `CONSTANT` **(default)** | Will take only the value of `apiNamePrefix` config option. | +resources/schemas/order-service.graphql*, * +resources/schemas/product-service.graphql*
* will result in: `OrderServiceQueryResolver.java` +, `ProductServiceQueryResolver.java`, etc | | `FOLDER_NAME_AS_PREFIX` | Will take parent folder name as a prefix for +all generated API interfaces + value of `apiNamePrefix` config option. E.g.:
* following schemas: * +resources/order-service/schema1.graphql*, * +resources/order-service/schema2.graphql*
* will result in: `OrderServiceQueryResolver.java` +, `OrderServiceGetOrderByIdQueryResolver.java`, etc | | `CONSTANT` **(default)** | Will take only the value +of `apiNamePrefix` config option. | ### Option `parentInterfaces` -Following options can be defined if you want generated resolvers to extend certain interfaces. -Can be handy if you are using [graphql-java-tools](https://github.com/graphql-java-kickstart/graphql-java-tools) and want your resolver classes to extend only interfaces generated by this plugin. +Following options can be defined if you want generated resolvers to extend certain interfaces. Can be handy if you are +using [graphql-java-tools](https://github.com/graphql-java-kickstart/graphql-java-tools) and want your resolver classes +to extend only interfaces generated by this plugin. -**Note:** if you want to include a GraphQL type name into the interface name, then use `{{TYPE}}` placeholder. E.g.: `graphql.kickstart.tools.GraphQLResolver<{{TYPE}}>` +**Note:** if you want to include a GraphQL type name into the interface name, then use `{{TYPE}}` placeholder. +E.g.: `graphql.kickstart.tools.GraphQLResolver<{{TYPE}}>` | Key inside `parentInterfaces` | Data Type | Default value | Description | | ----------------------------- | --------- | ------------- | ----------- | @@ -112,41 +126,42 @@ Can be handy if you are using [graphql-java-tools](https://github.com/graphql-ja | `subscriptionResolver` | String | Empty | Interface that will be added as "extend" to all generated api Subscription interfaces. | | `resolver` | String | Empty | Interface that will be added as "extend" to all generated TypeResolver interfaces. | - ### Option `customTypesMapping` -Can be used to supply custom mappings for scalars. +Can be used to supply custom mappings for scalars. Supports following formats: -* Map of (GraphQLObjectName.fieldName) to (JavaType). E.g.: `Event.dateTime = java.util.Date` -* Map of (GraphQLType) to (JavaType). E.g.: `EpochMillis = java.time.LocalDateTime` +* Map of (GraphQLObjectName.fieldName) to (JavaType). E.g.: `Event.dateTime = java.util.Date` +* Map of (GraphQLType) to (JavaType). E.g.: `EpochMillis = java.time.LocalDateTime` ### Option `customAnnotationsMapping` Can be used to supply custom annotations (serializers) for scalars. -`@` in front of the annotation class is optional. +`@` in front of the annotation class is optional. Supports following formats: -* Map of (GraphQLObjectName.fieldName) to (JavaAnnotation). E.g.: `Event.dateTime = @com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = com.example.DateDeserializer.class)` -* Map of (GraphQLType) to (JavaAnnotation). E.g.: `EpochMillis = @com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = com.example.EpochMillisDeserializer.class)` +* Map of (GraphQLObjectName.fieldName) to (JavaAnnotation). + E.g.: `Event.dateTime = @com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = com.example.DateDeserializer.class)` +* Map of (GraphQLType) to (JavaAnnotation). + E.g.: `EpochMillis = @com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = com.example.EpochMillisDeserializer.class)` ### Option `directiveAnnotationsMapping` -Can be used to supply custom annotations for directives in a following format: -Map of (GraphQL.directiveName) to (JavaAnnotation). E.g.: `auth = @org.springframework.security.access.annotation.Secured({{roles}})`. +Can be used to supply custom annotations for directives in a following format: +Map of (GraphQL.directiveName) to (JavaAnnotation). +E.g.: `auth = @org.springframework.security.access.annotation.Secured({{roles}})`. `@` in front of the annotation class is optional. -**Note:** In order to supply the value of directive argument to annotation, use placeholder `{{directiveArgument}}`. -You can also use one of the formatters for directive argument value: `{{val?toString}}`, `{{val?toArray}}`, `{{val?toArrayOfStrings}}`. - - +**Note:** In order to supply the value of directive argument to annotation, use placeholder `{{directiveArgument}}`. You +can also use one of the formatters for directive argument value: `{{val?toString}}`, `{{val?toArray}}` +, `{{val?toArrayOfStrings}}`. ### Option `relayConfig` -Can be used to supply a custom configuration for Relay support. -For reference see: https://www.graphql-java-kickstart.com/tools/relay/ +Can be used to supply a custom configuration for Relay support. For reference +see: https://www.graphql-java-kickstart.com/tools/relay/ | Key inside `relayConfig` | Data Type | Default value | Description | | ------------------------ | --------- | -------------------------- | ----------- | @@ -155,16 +170,17 @@ For reference see: https://www.graphql-java-kickstart.com/tools/relay/ | `connectionType` | String | `graphql.relay.Connection` | Generic Connection type. | For example, the following schema: + ``` type Query { users(first: Int, after: String): UserConnection @connection(for: "User") } ``` + will result in generating the interface with the following method: + ``` graphql.relay.Connection users(Integer first, String after) throws Exception; ``` - - ### External mapping configuration Provide a path to external file via property `jsonConfigurationFile` diff --git a/docs/migration-to-2.0.0.md b/docs/migration-to-2.0.0.md index 5d8031f68..88a15ed37 100644 --- a/docs/migration-to-2.0.0.md +++ b/docs/migration-to-2.0.0.md @@ -1,12 +1,16 @@ -Some breaking changes were introduced in [Release 2.0.0](https://github.com/kobylynskyi/graphql-java-codegen/releases/tag/v2.0.0). -So if you were using version 1.x.x then please follow steps below. +Some breaking changes were introduced +in [Release 2.0.0](https://github.com/kobylynskyi/graphql-java-codegen/releases/tag/v2.0.0). So if you were using +version 1.x.x then please follow steps below. ## Migration steps ### 1. Update plugin and library versions -As per plugin description: [Gradle](https://github.com/kobylynskyi/graphql-java-codegen/tree/master/plugins/gradle), [Maven](https://github.com/kobylynskyi/graphql-java-codegen/tree/master/plugins/maven) + +As per plugin description: [Gradle](https://github.com/kobylynskyi/graphql-java-codegen/tree/master/plugins/gradle) +, [Maven](https://github.com/kobylynskyi/graphql-java-codegen/tree/master/plugins/maven) ### 2. Update plugin configuration (only for client-side codegen) + If you have used `generateRequests` config option, please replace it with `generateClient`: Plugin | Old config | Replaced by ------ | ---------- | ----------- @@ -14,13 +18,15 @@ Maven | `true` | `true @@ -29,6 +33,7 @@ So now if you want to use async return type in your APIs, simply follow the new ``` #### Gradle + ```groovy // OLD APPROACH generateAsyncApis=true @@ -43,6 +48,7 @@ apiReturnListType=reactor.core.publisher.Flux ``` #### SBT + ```sbt // OLD APPROACH generateAsyncApis := true @@ -55,9 +61,12 @@ apiReturnType := Some("scala.concurrent.Future") ``` ### 3. Update plugin configuration for `customAnnotationsMapping` and `directiveAnnotationsMapping` -If you have used `customAnnotationsMapping` or `directiveAnnotationsMapping` config options, then it should be updated by providing an array of annotations in the following format: + +If you have used `customAnnotationsMapping` or `directiveAnnotationsMapping` config options, then it should be updated +by providing an array of annotations in the following format: #### Maven + ```xml @@ -89,6 +98,7 @@ If you have used `customAnnotationsMapping` or `directiveAnnotationsMapping` con ``` #### Gradle + ```groovy // OLD APPROACH customAnnotationsMapping = [ @@ -115,6 +125,7 @@ directiveAnnotationsMapping = [ ``` #### SBT + ```sbt // OLD APPROACH customAnnotationsMapping := { @@ -147,13 +158,15 @@ customAnnotationsMapping := { } // NEW APPROACH ``` -`directiveAnnotationsMapping`, In the same way. +`directiveAnnotationsMapping`, In the same way. ### 4. Regenerate the code + Run project build so that GraphQL classes are regenerated. --- -Feel free to ask any questions in [GitHub Discussions](https://github.com/kobylynskyi/graphql-java-codegen/discussions) or [create an issue](https://github.com/kobylynskyi/graphql-java-codegen/issues) if you discover some problems. +Feel free to ask any questions in [GitHub Discussions](https://github.com/kobylynskyi/graphql-java-codegen/discussions) +or [create an issue](https://github.com/kobylynskyi/graphql-java-codegen/issues) if you discover some problems. diff --git a/docs/migration-to-4.0.0.md b/docs/migration-to-4.0.0.md index fe2f3a422..5b392c5c2 100644 --- a/docs/migration-to-4.0.0.md +++ b/docs/migration-to-4.0.0.md @@ -1,28 +1,33 @@ -Some breaking changes were introduced in [Release 4.0.0](https://github.com/kobylynskyi/graphql-java-codegen/releases/tag/v4.0.0). -So if you were using version 3.x.x then please follow steps below. -Note: if you are migrating from version 2.x.x, then please also follow [3.0.0 migration guide](migration-to-3.0.0.md) first. +Some breaking changes were introduced +in [Release 4.0.0](https://github.com/kobylynskyi/graphql-java-codegen/releases/tag/v4.0.0). So if you were using +version 3.x.x then please follow steps below. Note: if you are migrating from version 2.x.x, then please also +follow [3.0.0 migration guide](migration-to-3.0.0.md) first. ## Migration steps ### 1. Update plugin and library versions -As per plugin description: [Gradle](https://github.com/kobylynskyi/graphql-java-codegen/tree/master/plugins/gradle), [Maven](https://github.com/kobylynskyi/graphql-java-codegen/tree/master/plugins/maven) +As per plugin description: [Gradle](https://github.com/kobylynskyi/graphql-java-codegen/tree/master/plugins/gradle) +, [Maven](https://github.com/kobylynskyi/graphql-java-codegen/tree/master/plugins/maven) ### 2. Change GraphQL Resolvers containing non-null GraphQL types to primitive Java types This effects the following types: + * GraphQL `Int` - * Non-null -> Java `int` - * Nullable -> Java `Integer` + * Non-null -> Java `int` + * Nullable -> Java `Integer` * GraphQL `Float` - * Non-null -> Java `double` - * Nullable -> Java `Double` + * Non-null -> Java `double` + * Nullable -> Java `Double` * GraphQL `Boolean` - * Non-null -> Java `boolean` - * Nullable -> Java `Boolean` + * Non-null -> Java `boolean` + * Nullable -> Java `Boolean` #### Example + Let's suppose there is a graphql schema: + ```graphql type Query { diffTypes(intNonNull: Int!, @@ -33,7 +38,9 @@ type Query { floatNullable: Float): Int! } ``` + And your GraphQL resolver (in version 3.x.x and below) looks like the following: + ```java public class DiffTypesQueryResolverImpl implements DiffTypesQueryResolver { @Override @@ -45,7 +52,10 @@ public class DiffTypesQueryResolverImpl implements DiffTypesQueryResolver { Double floatNullable) { return null; } } ``` -Now in version 4.0.0 the FeedsQueryResolver interface will be generated **with primitive types** for non-null GraphQL types: + +Now in version 4.0.0 the FeedsQueryResolver interface will be generated **with primitive types** for non-null GraphQL +types: + ```java public interface DiffTypesQueryResolver { int diffTypes(int intNonNull, @@ -56,7 +66,9 @@ public interface DiffTypesQueryResolver { Double floatNullable); } ``` + So you should change your resolver implementation to: + ```java public class DiffTypesQueryResolverImpl implements DiffTypesQueryResolver { @Override @@ -72,9 +84,11 @@ public class DiffTypesQueryResolverImpl implements DiffTypesQueryResolver { ``` ### 3. Regenerate the code + Run project build so that GraphQL classes are regenerated and your code compiles. --- -Feel free to ask any questions in [GitHub Discussions](https://github.com/kobylynskyi/graphql-java-codegen/discussions) or [create an issue](https://github.com/kobylynskyi/graphql-java-codegen/issues) if you discover some problems. +Feel free to ask any questions in [GitHub Discussions](https://github.com/kobylynskyi/graphql-java-codegen/discussions) +or [create an issue](https://github.com/kobylynskyi/graphql-java-codegen/issues) if you discover some problems. diff --git a/plugins/gradle/README.md b/plugins/gradle/README.md index 64271711e..cf95bfef7 100644 --- a/plugins/gradle/README.md +++ b/plugins/gradle/README.md @@ -8,12 +8,11 @@ * [Plugin Options](#plugin-options) * [Sample Plugin Configuration](#sample-plugin-configuration) * [Examples](#examples) - * [GraphQL **server** code generation](#graphql-server-code-generation) - * [GraphQL **client** code generation](#graphql-client-code-generation) + * [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) - ### Plugin Setup ```groovy @@ -71,7 +70,8 @@ compileJava.dependsOn 'graphqlCodegen' sourceSets.main.java.srcDir "$buildDir/generated" ``` -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) +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) #### build.gradle.kts: @@ -97,26 +97,27 @@ tasks.named("compileJava") { } ``` - ### Examples #### GraphQL **server** code generation [example-server](example-server): - * [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) -#### GraphQL **client** code generation +* [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) + +#### GraphQL **client** code generation [example-client](example-client): - * [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/product/ProductServiceGraphQLClient.java) - * [Building GraphQL request and parsing response using RestAssured](example-client/src/test/java/io/github/kobylynskyi/order/service/CreateProductIntegrationTest.java) +* [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/product/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 -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.: +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) { @@ -136,13 +137,11 @@ Later on you can call each task separately or together: * `gradle clean graphqlCodegenService2 build` * `gradle clean graphqlCodegenService1 graphqlCodegenService2 build` - ### Convert generated Java classes to Kotlin classes 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. - ### Inspired by [swagger-codegen](https://github.com/swagger-api/swagger-codegen) diff --git a/plugins/gradle/example-client-kotlin/build.gradle b/plugins/gradle/example-client-kotlin/build.gradle index 8d00aecd0..7b85dde81 100644 --- a/plugins/gradle/example-client-kotlin/build.gradle +++ b/plugins/gradle/example-client-kotlin/build.gradle @@ -4,10 +4,10 @@ import io.github.kobylynskyi.graphql.codegen.gradle.GraphQLCodegenGradleTask plugins { id 'java' id "org.jetbrains.kotlin.jvm" version "1.3.71" - id "io.github.kobylynskyi.graphql.codegen" version "4.1.4" + id "io.github.kobylynskyi.graphql.codegen" version "4.1.5-SNAPSHOT" } -def graphqlCodegenClientKotlinVersion = '4.1.4' // Variable used in the automatic release process +def graphqlCodegenClientKotlinVersion = '4.1.5-SNAPSHOT' // Variable used in the automatic release process group = 'io.github.dreamylost' version = graphqlCodegenClientKotlinVersion @@ -29,7 +29,7 @@ repositories { dependencies { - implementation "io.github.kobylynskyi:graphql-java-codegen:4.1.4" + implementation "io.github.kobylynskyi:graphql-java-codegen:4.1.5-SNAPSHOT" implementation "javax.validation:validation-api:2.0.1.Final" implementation "com.squareup.okhttp3:okhttp:4.2.2" implementation "com.fasterxml.jackson.core:jackson-core:2.12.0" diff --git a/plugins/gradle/example-client/build.gradle b/plugins/gradle/example-client/build.gradle index 6a992a944..fbdaabcdd 100644 --- a/plugins/gradle/example-client/build.gradle +++ b/plugins/gradle/example-client/build.gradle @@ -7,7 +7,7 @@ plugins { // use the latest available version: // https://plugins.gradle.org/plugin/io.github.kobylynskyi.graphql.codegen - id "io.github.kobylynskyi.graphql.codegen" version "4.1.4" + id "io.github.kobylynskyi.graphql.codegen" version "4.1.5-SNAPSHOT" } mainClassName = "io.github.kobylynskyi.order.Application" @@ -22,7 +22,7 @@ dependencies { // use the latest available version: // https://search.maven.org/artifact/io.github.kobylynskyi/graphql-java-codegen - implementation "io.github.kobylynskyi:graphql-java-codegen:4.1.4" + implementation "io.github.kobylynskyi:graphql-java-codegen:4.1.5-SNAPSHOT" implementation "org.apache.httpcomponents:httpclient:4.5.13" implementation "javax.validation:validation-api:2.0.1.Final" diff --git a/plugins/gradle/example-client/src/main/java/io/github/kobylynskyi/order/graphql/resolvers/MutationsResolver.java b/plugins/gradle/example-client/src/main/java/io/github/kobylynskyi/order/graphql/resolvers/MutationsResolver.java index 821fa4dba..2e0e9e568 100644 --- a/plugins/gradle/example-client/src/main/java/io/github/kobylynskyi/order/graphql/resolvers/MutationsResolver.java +++ b/plugins/gradle/example-client/src/main/java/io/github/kobylynskyi/order/graphql/resolvers/MutationsResolver.java @@ -10,7 +10,8 @@ import org.springframework.stereotype.Component; @Component -public class MutationsResolver implements CreateMutationResolver, AddProductToOrderMutationResolver, GraphQLMutationResolver { +public class MutationsResolver implements + CreateMutationResolver, AddProductToOrderMutationResolver, GraphQLMutationResolver { @Autowired private OrderService service; diff --git a/plugins/gradle/example-client/src/main/java/io/github/kobylynskyi/order/service/OrderService.java b/plugins/gradle/example-client/src/main/java/io/github/kobylynskyi/order/service/OrderService.java index b549bb660..ca89864ad 100644 --- a/plugins/gradle/example-client/src/main/java/io/github/kobylynskyi/order/service/OrderService.java +++ b/plugins/gradle/example-client/src/main/java/io/github/kobylynskyi/order/service/OrderService.java @@ -6,7 +6,6 @@ import io.github.kobylynskyi.order.model.OrderNotFoundException; import io.github.kobylynskyi.order.model.Product; import io.github.kobylynskyi.order.model.UnableToRetrieveProductException; -import io.github.kobylynskyi.order.model.UnableToRetrieveProductsException; import io.github.kobylynskyi.order.repository.OrderRepository; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -39,13 +38,26 @@ public Order create() { return saved; } - public Order addProduct(String orderId, String productId, int quantity) throws OrderNotFoundException, UnableToRetrieveProductException, UnableToRetrieveProductsException { + public Order addProduct(String orderId, String productId, int quantity) + throws OrderNotFoundException, UnableToRetrieveProductException { Order order = getOrderById(orderId); - - Product product = productService.getProduct(productId); // for bulk use: // Product product = productService.getProducts(Collections.singletonList(productId)).get(0); - Item item = order.getItems().stream() + Product product = productService.getProduct(productId); + Item item = getItem(productId, order); + updateOrderItem(item, product, quantity); + repository.save(order); + log.info("Added product [id: {}] to the order [id: {}]", product.getId(), order.getId()); + return order; + } + + private void updateOrderItem(Item item, Product product, int quantity) { + item.setQuantity(item.getQuantity() + quantity); + item.setTotal(product.getPrice().multiply(BigDecimal.valueOf(item.getQuantity()))); + } + + private Item getItem(String productId, Order order) { + return order.getItems().stream() .filter(p -> p.getProductId().equals(productId)) .findFirst() .orElseGet(() -> { @@ -53,11 +65,6 @@ public Order addProduct(String orderId, String productId, int quantity) throws O order.getItems().add(newItem); return newItem; }); - item.setQuantity(item.getQuantity() + quantity); - item.setTotal(product.getPrice().multiply(BigDecimal.valueOf(item.getQuantity()))); - repository.save(order); - log.info("Added product [id: {}] to the order [id: {}]", product.getId(), order.getId()); - return order; } } diff --git a/plugins/gradle/example-client/src/test/java/io/github/kobylynskyi/order/service/CreateProductIntegrationTest.java b/plugins/gradle/example-client/src/test/java/io/github/kobylynskyi/order/service/CreateProductIntegrationTest.java index dfb49843d..f07e3cd56 100644 --- a/plugins/gradle/example-client/src/test/java/io/github/kobylynskyi/order/service/CreateProductIntegrationTest.java +++ b/plugins/gradle/example-client/src/test/java/io/github/kobylynskyi/order/service/CreateProductIntegrationTest.java @@ -2,7 +2,11 @@ import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLRequest; import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResult; -import io.github.kobylynskyi.product.graphql.model.*; +import io.github.kobylynskyi.product.graphql.model.CreateMutationRequest; +import io.github.kobylynskyi.product.graphql.model.ProductInputTO; +import io.github.kobylynskyi.product.graphql.model.ProductResponseProjection; +import io.github.kobylynskyi.product.graphql.model.ProductTO; +import io.github.kobylynskyi.product.graphql.model.StockStatusTO; import io.restassured.common.mapper.TypeRef; import io.restassured.http.ContentType; import org.junit.jupiter.api.Disabled; @@ -12,7 +16,9 @@ import java.util.Map; import static io.restassured.RestAssured.given; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; class CreateProductIntegrationTest { @@ -33,7 +39,8 @@ void createProductUsingRestAssured() { .post("/graphql") .then() .statusCode(200) - .extract().response().as(new TypeRef>>() {}); + .extract().response().as(new TypeRef>>() { + }); assertFalse(result.hasErrors()); ProductTO createdProduct = result.getData().get(createProductMutation.getOperationName()); diff --git a/plugins/gradle/example-server/build.gradle b/plugins/gradle/example-server/build.gradle index 5ba8ec60a..9b952d59e 100644 --- a/plugins/gradle/example-server/build.gradle +++ b/plugins/gradle/example-server/build.gradle @@ -6,7 +6,7 @@ plugins { // // use the latest available version: // https://plugins.gradle.org/plugin/io.github.kobylynskyi.graphql.codegen - id "io.github.kobylynskyi.graphql.codegen" version "4.1.4" + id "io.github.kobylynskyi.graphql.codegen" version "4.1.5-SNAPSHOT" } mainClassName = "io.github.kobylynskyi.product.Application" diff --git a/plugins/gradle/example-server/src/main/java/io/github/kobylynskyi/product/graphql/mappers/ProductMapper.java b/plugins/gradle/example-server/src/main/java/io/github/kobylynskyi/product/graphql/mappers/ProductMapper.java index d958f3598..7458dba0b 100644 --- a/plugins/gradle/example-server/src/main/java/io/github/kobylynskyi/product/graphql/mappers/ProductMapper.java +++ b/plugins/gradle/example-server/src/main/java/io/github/kobylynskyi/product/graphql/mappers/ProductMapper.java @@ -12,8 +12,7 @@ public interface ProductMapper { ProductTO map(Product from); @Mapping(target = "id", ignore = true) // auto-generated - @Mapping(target = "addedDateTime", ignore = true) - // set in the service + @Mapping(target = "addedDateTime", ignore = true) // this property is set in the service Product mapInput(ProductInputTO from); } diff --git a/plugins/gradle/example-server/src/main/java/io/github/kobylynskyi/product/graphql/resolvers/MutationsResolver.java b/plugins/gradle/example-server/src/main/java/io/github/kobylynskyi/product/graphql/resolvers/MutationsResolver.java index d79f091c6..58f368f46 100644 --- a/plugins/gradle/example-server/src/main/java/io/github/kobylynskyi/product/graphql/resolvers/MutationsResolver.java +++ b/plugins/gradle/example-server/src/main/java/io/github/kobylynskyi/product/graphql/resolvers/MutationsResolver.java @@ -18,8 +18,8 @@ public class MutationsResolver implements CreateMutationResolver { private ProductMapper mapper; @Override - public ProductTO create(ProductInputTO ProductInputTO) { - Product savedProduct = service.create(mapper.mapInput(ProductInputTO)); + public ProductTO create(ProductInputTO productInput) { + Product savedProduct = service.create(mapper.mapInput(productInput)); return mapper.map(savedProduct); } } diff --git a/plugins/gradle/graphql-java-codegen-gradle-plugin/build.gradle b/plugins/gradle/graphql-java-codegen-gradle-plugin/build.gradle index d78239713..c09ed4cd0 100644 --- a/plugins/gradle/graphql-java-codegen-gradle-plugin/build.gradle +++ b/plugins/gradle/graphql-java-codegen-gradle-plugin/build.gradle @@ -16,7 +16,7 @@ apply plugin: "java" apply plugin: "idea" apply plugin: "maven-publish" -def graphqlCodegenGradlePluginVersion = '4.1.4' // This variable used in the automatic release process +def graphqlCodegenGradlePluginVersion = '4.1.5-SNAPSHOT' // This variable used in the automatic release process group = "io.github.kobylynskyi" version = graphqlCodegenGradlePluginVersion diff --git a/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/GraphQLCodegenGradleTask.java b/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/GraphQLCodegenGradleTask.java index a70708c52..c3c63154b 100644 --- a/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/GraphQLCodegenGradleTask.java +++ b/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/GraphQLCodegenGradleTask.java @@ -38,6 +38,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.function.Supplier; /** * Gradle task for GraphQL code generation @@ -105,13 +106,22 @@ public GraphQLCodegenGradleTask() { setDescription("Generates Java POJOs and interfaces based on GraphQL schemas"); } + /** + * Perform code generation + * + * @throws Exception in case source file is not found, there is an invalid schema or there are any problems + * with a configuration + */ @TaskAction public void generate() throws Exception { MappingConfig mappingConfig = new MappingConfig(); mappingConfig.setPackageName(packageName); - mappingConfig.setCustomTypesMapping(customTypesMapping != null ? customTypesMapping : new HashMap<>()); - mappingConfig.setCustomAnnotationsMapping(customAnnotationsMapping != null ? customAnnotationsMapping : new HashMap<>()); - mappingConfig.setDirectiveAnnotationsMapping(directiveAnnotationsMapping != null ? directiveAnnotationsMapping : new HashMap<>()); + mappingConfig.setCustomTypesMapping( + customTypesMapping != null ? customTypesMapping : new HashMap<>()); + mappingConfig.setCustomAnnotationsMapping( + customAnnotationsMapping != null ? customAnnotationsMapping : new HashMap<>()); + mappingConfig.setDirectiveAnnotationsMapping( + directiveAnnotationsMapping != null ? directiveAnnotationsMapping : new HashMap<>()); mappingConfig.setApiNameSuffix(apiNameSuffix); mappingConfig.setApiNamePrefix(apiNamePrefix); mappingConfig.setApiRootInterfaceStrategy(apiRootInterfaceStrategy); @@ -139,8 +149,10 @@ public void generate() throws Exception { mappingConfig.setGenerateDataFetchingEnvironmentArgumentInApis(generateDataFetchingEnvironmentArgumentInApis); mappingConfig.setGenerateExtensionFieldsResolvers(generateExtensionFieldsResolvers); mappingConfig.setGenerateModelsForRootTypes(generateModelsForRootTypes); - mappingConfig.setFieldsWithResolvers(fieldsWithResolvers != null ? fieldsWithResolvers : new HashSet<>()); - mappingConfig.setFieldsWithoutResolvers(fieldsWithoutResolvers != null ? fieldsWithoutResolvers : new HashSet<>()); + mappingConfig.setFieldsWithResolvers( + fieldsWithResolvers != null ? fieldsWithResolvers : new HashSet<>()); + mappingConfig.setFieldsWithoutResolvers( + fieldsWithoutResolvers != null ? fieldsWithoutResolvers : new HashSet<>()); mappingConfig.setRelayConfig(relayConfig); mappingConfig.setGenerateClient(generateClient); @@ -148,7 +160,8 @@ public void generate() throws Exception { mappingConfig.setResponseSuffix(responseSuffix); mappingConfig.setResponseProjectionSuffix(responseProjectionSuffix); mappingConfig.setParametrizedInputSuffix(parametrizedInputSuffix); - mappingConfig.setUseObjectMapperForRequestSerialization(useObjectMapperForRequestSerialization != null ? useObjectMapperForRequestSerialization : new HashSet<>()); + mappingConfig.setUseObjectMapperForRequestSerialization(useObjectMapperForRequestSerialization != null ? + useObjectMapperForRequestSerialization : new HashSet<>()); mappingConfig.setResponseProjectionMaxDepth(responseProjectionMaxDepth); mappingConfig.setResolverParentInterface(getResolverParentInterface()); @@ -163,21 +176,33 @@ public void generate() throws Exception { } private GraphQLCodegen instantiateCodegen(MappingConfig mappingConfig) throws IOException { - switch (generatedLanguage) { + java.util.Optional mappingConfigSupplier = buildJsonSupplier(); + GeneratedLanguage language = mappingConfigSupplier.map(Supplier::get) + .map(MappingConfig::getGeneratedLanguage) + .orElse(generatedLanguage); + switch (language) { case JAVA: - return new JavaGraphQLCodegen(getActualSchemaPaths(), graphqlQueryIntrospectionResultPath, outputDir, mappingConfig, buildJsonSupplier()); + return new JavaGraphQLCodegen(getActualSchemaPaths(), graphqlQueryIntrospectionResultPath, + outputDir, mappingConfig, mappingConfigSupplier.orElse(null)); case SCALA: - return new ScalaGraphQLCodegen(getActualSchemaPaths(), graphqlQueryIntrospectionResultPath, outputDir, mappingConfig, buildJsonSupplier()); + return new ScalaGraphQLCodegen(getActualSchemaPaths(), graphqlQueryIntrospectionResultPath, + outputDir, mappingConfig, mappingConfigSupplier.orElse(null)); case KOTLIN: - return new KotlinGraphQLCodegen(getActualSchemaPaths(), graphqlQueryIntrospectionResultPath, outputDir, mappingConfig, buildJsonSupplier()); + return new KotlinGraphQLCodegen(getActualSchemaPaths(), graphqlQueryIntrospectionResultPath, + outputDir, mappingConfig, mappingConfigSupplier.orElse(null)); default: - throw new LanguageNotSupportedException(generatedLanguage); + throw new LanguageNotSupportedException(language); } } - // This is only public so that it can be part of the inputs. - // Changes to schema contents need to invalidate this task, and require re-run. - // Using the SchemaFinder, we need to calculate the resulting list of paths as @InputFiles for it to work. + /** + * This is only public so that it can be part of the inputs. + * Changes to schema contents need to invalidate this task, and require re-run. + * Using the SchemaFinder, we need to calculate the resulting list of paths as @InputFiles for it to work. + * + * @return a list of schema files that will be processed. + * @throws IOException in case some I/O error occurred + */ @InputFiles public List getActualSchemaPaths() throws IOException { if (graphqlSchemaPaths != null) { @@ -216,11 +241,11 @@ private java.util.Optional findDefaultResourcesDir() { .map(File::toPath); } - private MappingConfigSupplier buildJsonSupplier() { + private java.util.Optional buildJsonSupplier() { if (jsonConfigurationFile != null && !jsonConfigurationFile.isEmpty()) { - return new JsonMappingConfigSupplier(jsonConfigurationFile); + return java.util.Optional.of(new JsonMappingConfigSupplier(jsonConfigurationFile)); } - return null; + return java.util.Optional.empty(); } @InputFiles @@ -566,7 +591,8 @@ public Boolean getGenerateDataFetchingEnvironmentArgumentInApis() { return generateDataFetchingEnvironmentArgumentInApis; } - public void setGenerateDataFetchingEnvironmentArgumentInApis(Boolean generateDataFetchingEnvironmentArgumentInApis) { + public void setGenerateDataFetchingEnvironmentArgumentInApis( + Boolean generateDataFetchingEnvironmentArgumentInApis) { this.generateDataFetchingEnvironmentArgumentInApis = generateDataFetchingEnvironmentArgumentInApis; } diff --git a/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/ParentInterfacesConfig.java b/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/ParentInterfacesConfig.java index aaf6d05c2..f67ac2ca6 100644 --- a/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/ParentInterfacesConfig.java +++ b/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/ParentInterfacesConfig.java @@ -3,6 +3,9 @@ import org.gradle.api.tasks.Input; import org.gradle.api.tasks.Optional; +/** + * Configuration of parent interfaces to be used during code generation + */ public class ParentInterfacesConfig { private String queryResolver; diff --git a/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/RelayConfig.java b/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/RelayConfig.java index 524969076..95a9974a8 100644 --- a/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/RelayConfig.java +++ b/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/RelayConfig.java @@ -3,6 +3,9 @@ import org.gradle.api.tasks.Input; import org.gradle.api.tasks.Optional; +/** + * Relay-relatedconfigurations + */ public class RelayConfig extends com.kobylynskyi.graphql.codegen.model.RelayConfig { @Input diff --git a/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/SchemaFinderConfig.java b/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/SchemaFinderConfig.java index 06fc78446..10c688a4b 100644 --- a/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/SchemaFinderConfig.java +++ b/plugins/gradle/graphql-java-codegen-gradle-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/gradle/SchemaFinderConfig.java @@ -1,14 +1,16 @@ package io.github.kobylynskyi.graphql.codegen.gradle; import com.kobylynskyi.graphql.codegen.supplier.SchemaFinder; - -import java.util.Collections; -import java.util.Set; - import org.gradle.api.tasks.Input; import org.gradle.api.tasks.InputFiles; import org.gradle.api.tasks.Optional; +import java.util.Collections; +import java.util.Set; + +/** + * Configuration of dynamic GraphQL schema finder + */ public class SchemaFinderConfig { private String rootDir; @@ -20,7 +22,8 @@ public class SchemaFinderConfig { private Set excludedFiles = Collections.emptySet(); // This should not be replaced by @InputDirectory, because some files in this directory may not be schemas. - // We only know the actual list of schema files to check after running the SchemaFinder, so @InputFiles is over there. + // We only know the actual list of schema files to check after running the SchemaFinder, + // so @InputFiles is over there. @Input @Optional public String getRootDir() { diff --git a/plugins/maven/README.md b/plugins/maven/README.md index 59e2ce201..fa9869a65 100644 --- a/plugins/maven/README.md +++ b/plugins/maven/README.md @@ -7,11 +7,10 @@ * [Plugin Setup and Configuration](#plugin-setup-and-configuration) * [Plugin Options](#plugin-options) * [Examples](#examples) - * [GraphQL **server** code generation](#graphql-server-code-generation) - * [GraphQL **client** code generation](#graphql-client-code-generation) + * [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) - ### Plugin Setup and Configuration ```xml @@ -55,8 +54,8 @@ ``` -You can run the plugin manually with `mvn generate-sources`. It will be run automatically as part of the Maven lifecycle when compiling your code - +You can run the plugin manually with `mvn generate-sources`. It will be run automatically as part of the Maven lifecycle +when compiling your code ### Plugin Options @@ -67,20 +66,22 @@ Please refer to [Codegen Options](../../docs/codegen-options.md) #### GraphQL **server** code generation [example-server](example-server): - * [Plugin configuration in pom.xml](example-server/pom.xml) - * [GraphQL Resolver classes that implement generated interfaces](example-server/src/main/java/io/github/kobylynskyi/product/graphql/resolvers) + +* [Plugin configuration in pom.xml](example-server/pom.xml) +* [GraphQL Resolver classes that implement generated interfaces](example-server/src/main/java/io/github/kobylynskyi/product/graphql/resolvers) #### GraphQL **client** code generation [example-client](example-client): - * [Plugin configuration in pom.xml](example-client/pom.xml) - * [Building GraphQL request and parsing response using Spring RestTemplate](example-client/src/main/java/io/github/kobylynskyi/order/external/product/ProductServiceGraphQLClient.java) - * [Building GraphQL request and parsing response using RestAssured](example-client/src/test/java/io/github/kobylynskyi/order/service/CreateProductIntegrationTest.java) +* [Plugin configuration in pom.xml](example-client/pom.xml) +* [Building GraphQL request and parsing response using Spring RestTemplate](example-client/src/main/java/io/github/kobylynskyi/order/external/product/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 -If you want to have different configuration for different `.graphqls` files (e.g.: different javaPackage, outputDir, etc.), then you will need to define separate executions for each set of schemas. E.g.: +If you want to have different configuration for different `.graphqls` files (e.g.: different javaPackage, outputDir, +etc.), then you will need to define separate executions for each set of schemas. E.g.: ```xml @@ -107,7 +108,7 @@ If you want to have different configuration for different `.graphqls` files (e.g ``` - ### Inspired by + [swagger-codegen](https://github.com/swagger-api/swagger-codegen) diff --git a/plugins/maven/example-client/pom.xml b/plugins/maven/example-client/pom.xml index 8562510b9..1d59f6784 100644 --- a/plugins/maven/example-client/pom.xml +++ b/plugins/maven/example-client/pom.xml @@ -1,10 +1,10 @@ - 4.0.0 io.github.kobylynskyi graphql-codegen-maven-plugin-example-client - 4.1.4 + 4.1.5-SNAPSHOT graphql-codegen-maven-plugin-example-client @@ -74,8 +74,12 @@ io.github.kobylynskyi.starwars.graphql - @com.fasterxml.jackson.annotation.JsonTypeInfo(use = com.fasterxml.jackson.annotation.JsonTypeInfo.Id.NAME, property = "__typename") - @com.fasterxml.jackson.databind.annotation.JsonTypeIdResolver(io.github.kobylynskyi.order.external.starwars.CharacterTypeResolver.class) + @com.fasterxml.jackson.annotation.JsonTypeInfo(use = + com.fasterxml.jackson.annotation.JsonTypeInfo.Id.NAME, property = "__typename") + + + @com.fasterxml.jackson.databind.annotation.JsonTypeIdResolver(io.github.kobylynskyi.order.external.starwars.CharacterTypeResolver.class) + true diff --git a/plugins/maven/example-client/src/main/java/io/github/kobylynskyi/order/external/starwars/CharacterTypeResolver.java b/plugins/maven/example-client/src/main/java/io/github/kobylynskyi/order/external/starwars/CharacterTypeResolver.java index 4b2a7b5f7..38ac4cc59 100644 --- a/plugins/maven/example-client/src/main/java/io/github/kobylynskyi/order/external/starwars/CharacterTypeResolver.java +++ b/plugins/maven/example-client/src/main/java/io/github/kobylynskyi/order/external/starwars/CharacterTypeResolver.java @@ -7,6 +7,9 @@ import io.github.kobylynskyi.starwars.graphql.Droid; import io.github.kobylynskyi.starwars.graphql.Human; +/** + * Resolver of Character type + */ public class CharacterTypeResolver extends TypeIdResolverBase { private JavaType superType; diff --git a/plugins/maven/example-client/src/main/java/io/github/kobylynskyi/order/graphql/resolvers/MutationsResolver.java b/plugins/maven/example-client/src/main/java/io/github/kobylynskyi/order/graphql/resolvers/MutationsResolver.java index 821fa4dba..2e0e9e568 100644 --- a/plugins/maven/example-client/src/main/java/io/github/kobylynskyi/order/graphql/resolvers/MutationsResolver.java +++ b/plugins/maven/example-client/src/main/java/io/github/kobylynskyi/order/graphql/resolvers/MutationsResolver.java @@ -10,7 +10,8 @@ import org.springframework.stereotype.Component; @Component -public class MutationsResolver implements CreateMutationResolver, AddProductToOrderMutationResolver, GraphQLMutationResolver { +public class MutationsResolver implements + CreateMutationResolver, AddProductToOrderMutationResolver, GraphQLMutationResolver { @Autowired private OrderService service; diff --git a/plugins/maven/example-client/src/main/java/io/github/kobylynskyi/order/service/OrderService.java b/plugins/maven/example-client/src/main/java/io/github/kobylynskyi/order/service/OrderService.java index b549bb660..ca89864ad 100644 --- a/plugins/maven/example-client/src/main/java/io/github/kobylynskyi/order/service/OrderService.java +++ b/plugins/maven/example-client/src/main/java/io/github/kobylynskyi/order/service/OrderService.java @@ -6,7 +6,6 @@ import io.github.kobylynskyi.order.model.OrderNotFoundException; import io.github.kobylynskyi.order.model.Product; import io.github.kobylynskyi.order.model.UnableToRetrieveProductException; -import io.github.kobylynskyi.order.model.UnableToRetrieveProductsException; import io.github.kobylynskyi.order.repository.OrderRepository; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -39,13 +38,26 @@ public Order create() { return saved; } - public Order addProduct(String orderId, String productId, int quantity) throws OrderNotFoundException, UnableToRetrieveProductException, UnableToRetrieveProductsException { + public Order addProduct(String orderId, String productId, int quantity) + throws OrderNotFoundException, UnableToRetrieveProductException { Order order = getOrderById(orderId); - - Product product = productService.getProduct(productId); // for bulk use: // Product product = productService.getProducts(Collections.singletonList(productId)).get(0); - Item item = order.getItems().stream() + Product product = productService.getProduct(productId); + Item item = getItem(productId, order); + updateOrderItem(item, product, quantity); + repository.save(order); + log.info("Added product [id: {}] to the order [id: {}]", product.getId(), order.getId()); + return order; + } + + private void updateOrderItem(Item item, Product product, int quantity) { + item.setQuantity(item.getQuantity() + quantity); + item.setTotal(product.getPrice().multiply(BigDecimal.valueOf(item.getQuantity()))); + } + + private Item getItem(String productId, Order order) { + return order.getItems().stream() .filter(p -> p.getProductId().equals(productId)) .findFirst() .orElseGet(() -> { @@ -53,11 +65,6 @@ public Order addProduct(String orderId, String productId, int quantity) throws O order.getItems().add(newItem); return newItem; }); - item.setQuantity(item.getQuantity() + quantity); - item.setTotal(product.getPrice().multiply(BigDecimal.valueOf(item.getQuantity()))); - repository.save(order); - log.info("Added product [id: {}] to the order [id: {}]", product.getId(), order.getId()); - return order; } } diff --git a/plugins/maven/example-client/src/test/java/io/github/kobylynskyi/order/service/CreateProductIntegrationTest.java b/plugins/maven/example-client/src/test/java/io/github/kobylynskyi/order/service/CreateProductIntegrationTest.java index dfb49843d..f07e3cd56 100644 --- a/plugins/maven/example-client/src/test/java/io/github/kobylynskyi/order/service/CreateProductIntegrationTest.java +++ b/plugins/maven/example-client/src/test/java/io/github/kobylynskyi/order/service/CreateProductIntegrationTest.java @@ -2,7 +2,11 @@ import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLRequest; import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLResult; -import io.github.kobylynskyi.product.graphql.model.*; +import io.github.kobylynskyi.product.graphql.model.CreateMutationRequest; +import io.github.kobylynskyi.product.graphql.model.ProductInputTO; +import io.github.kobylynskyi.product.graphql.model.ProductResponseProjection; +import io.github.kobylynskyi.product.graphql.model.ProductTO; +import io.github.kobylynskyi.product.graphql.model.StockStatusTO; import io.restassured.common.mapper.TypeRef; import io.restassured.http.ContentType; import org.junit.jupiter.api.Disabled; @@ -12,7 +16,9 @@ import java.util.Map; import static io.restassured.RestAssured.given; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; class CreateProductIntegrationTest { @@ -33,7 +39,8 @@ void createProductUsingRestAssured() { .post("/graphql") .then() .statusCode(200) - .extract().response().as(new TypeRef>>() {}); + .extract().response().as(new TypeRef>>() { + }); assertFalse(result.hasErrors()); ProductTO createdProduct = result.getData().get(createProductMutation.getOperationName()); diff --git a/plugins/maven/example-server/pom.xml b/plugins/maven/example-server/pom.xml index b37d6c837..85e59f38f 100644 --- a/plugins/maven/example-server/pom.xml +++ b/plugins/maven/example-server/pom.xml @@ -1,10 +1,10 @@ - 4.0.0 io.github.kobylynskyi graphql-codegen-maven-plugin-example-server - 4.1.4 + 4.1.5-SNAPSHOT graphql-codegen-maven-plugin-example-server @@ -23,7 +23,8 @@ - ${project.basedir}/src/main/resources/schema.graphqls + ${project.basedir}/src/main/resources/schema.graphqls + ${project.build.directory}/generated-sources/graphql io.github.kobylynskyi.product.graphql.api @@ -35,7 +36,8 @@ graphql.kickstart.tools.GraphQLQueryResolver graphql.kickstart.tools.GraphQLMutationResolver - graphql.kickstart.tools.GraphQLSubscriptionResolver + graphql.kickstart.tools.GraphQLSubscriptionResolver + ]]> diff --git a/plugins/maven/example-server/src/main/java/io/github/kobylynskyi/product/graphql/mappers/ProductMapper.java b/plugins/maven/example-server/src/main/java/io/github/kobylynskyi/product/graphql/mappers/ProductMapper.java index d958f3598..7458dba0b 100644 --- a/plugins/maven/example-server/src/main/java/io/github/kobylynskyi/product/graphql/mappers/ProductMapper.java +++ b/plugins/maven/example-server/src/main/java/io/github/kobylynskyi/product/graphql/mappers/ProductMapper.java @@ -12,8 +12,7 @@ public interface ProductMapper { ProductTO map(Product from); @Mapping(target = "id", ignore = true) // auto-generated - @Mapping(target = "addedDateTime", ignore = true) - // set in the service + @Mapping(target = "addedDateTime", ignore = true) // this property is set in the service Product mapInput(ProductInputTO from); } diff --git a/plugins/maven/example-server/src/main/java/io/github/kobylynskyi/product/graphql/resolvers/MutationsResolver.java b/plugins/maven/example-server/src/main/java/io/github/kobylynskyi/product/graphql/resolvers/MutationsResolver.java index d79f091c6..58f368f46 100644 --- a/plugins/maven/example-server/src/main/java/io/github/kobylynskyi/product/graphql/resolvers/MutationsResolver.java +++ b/plugins/maven/example-server/src/main/java/io/github/kobylynskyi/product/graphql/resolvers/MutationsResolver.java @@ -18,8 +18,8 @@ public class MutationsResolver implements CreateMutationResolver { private ProductMapper mapper; @Override - public ProductTO create(ProductInputTO ProductInputTO) { - Product savedProduct = service.create(mapper.mapInput(ProductInputTO)); + public ProductTO create(ProductInputTO productInput) { + Product savedProduct = service.create(mapper.mapInput(productInput)); return mapper.map(savedProduct); } } diff --git a/plugins/maven/graphql-java-codegen-maven-plugin/pom.xml b/plugins/maven/graphql-java-codegen-maven-plugin/pom.xml index 865233373..2a987240d 100644 --- a/plugins/maven/graphql-java-codegen-maven-plugin/pom.xml +++ b/plugins/maven/graphql-java-codegen-maven-plugin/pom.xml @@ -1,9 +1,10 @@ - + 4.0.0 io.github.kobylynskyi graphql-codegen-maven-plugin - 4.1.4 + 4.1.5-SNAPSHOT maven-plugin graphql-codegen-maven-plugin @@ -36,8 +37,8 @@ scm:git:git@github.com:kobylynskyi/graphql-java-codegen.git https://github.com/kobylynskyi/graphql-java-codegen/tree/master/plugins/maven - HEAD - + HEAD + @@ -72,7 +73,7 @@ 1.6 3.3.3 - 4.1.4 + 4.1.5-SNAPSHOT diff --git a/plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/GraphQLCodegenMojo.java b/plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/GraphQLCodegenMojo.java index e201de058..b77bb9db0 100644 --- a/plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/GraphQLCodegenMojo.java +++ b/plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/GraphQLCodegenMojo.java @@ -39,7 +39,11 @@ import java.util.Optional; import java.util.Properties; import java.util.Set; +import java.util.function.Supplier; +/** + * GraphQL Codegen MOJO implementation + */ @Mojo(name = "generate", defaultPhase = LifecyclePhase.GENERATE_SOURCES, threadSafe = true) public class GraphQLCodegenMojo extends AbstractMojo implements GraphQLCodegenConfiguration { @@ -261,15 +265,22 @@ public void execute() throws MojoExecutionException { } private GraphQLCodegen instantiateCodegen(MappingConfig mappingConfig) throws IOException { - switch (generatedLanguage) { + java.util.Optional mappingConfigSupplier = buildJsonSupplier(jsonConfigurationFile); + GeneratedLanguage language = mappingConfigSupplier.map(Supplier::get) + .map(MappingConfig::getGeneratedLanguage) + .orElse(generatedLanguage); + switch (language) { case JAVA: - return new JavaGraphQLCodegen(getSchemas(), graphqlQueryIntrospectionResultPath, outputDir, mappingConfig, buildJsonSupplier(jsonConfigurationFile)); + return new JavaGraphQLCodegen(getSchemas(), graphqlQueryIntrospectionResultPath, + outputDir, mappingConfig, mappingConfigSupplier.orElse(null)); case SCALA: - return new ScalaGraphQLCodegen(getSchemas(), graphqlQueryIntrospectionResultPath, outputDir, mappingConfig, buildJsonSupplier(jsonConfigurationFile)); + return new ScalaGraphQLCodegen(getSchemas(), graphqlQueryIntrospectionResultPath, + outputDir, mappingConfig, mappingConfigSupplier.orElse(null)); case KOTLIN: - return new KotlinGraphQLCodegen(getSchemas(), graphqlQueryIntrospectionResultPath, outputDir, mappingConfig, buildJsonSupplier(jsonConfigurationFile)); + return new KotlinGraphQLCodegen(getSchemas(), graphqlQueryIntrospectionResultPath, + outputDir, mappingConfig, mappingConfigSupplier.orElse(null)); default: - throw new LanguageNotSupportedException(generatedLanguage); + throw new LanguageNotSupportedException(language); } } @@ -301,11 +312,11 @@ private Optional getDefaultResourcesDirectory() { return project.getResources().stream().findFirst().map(Resource::getDirectory).map(Paths::get); } - private MappingConfigSupplier buildJsonSupplier(String jsonConfigurationFile) { + private java.util.Optional buildJsonSupplier(String jsonConfigurationFile) { if (jsonConfigurationFile != null && !jsonConfigurationFile.isEmpty()) { - return new JsonMappingConfigSupplier(jsonConfigurationFile); + return java.util.Optional.of(new JsonMappingConfigSupplier(jsonConfigurationFile)); } - return null; + return java.util.Optional.empty(); } private void addCompileSourceRootIfConfigured() { diff --git a/plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/ParentInterfacesConfig.java b/plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/ParentInterfacesConfig.java index 0dee2a69e..5ce3b96ef 100644 --- a/plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/ParentInterfacesConfig.java +++ b/plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/ParentInterfacesConfig.java @@ -1,5 +1,8 @@ package io.github.kobylynskyi.graphql.codegen; +/** + * Configuration of parent interfaces to be used during code generation + */ public class ParentInterfacesConfig { private String queryResolver; @@ -11,30 +14,30 @@ public String getQueryResolver() { return queryResolver; } - public String getMutationResolver() { - return mutationResolver; - } - - public String getSubscriptionResolver() { - return subscriptionResolver; - } - - public String getResolver() { - return resolver; - } - public void setQueryResolver(String queryResolver) { this.queryResolver = queryResolver; } + public String getMutationResolver() { + return mutationResolver; + } + public void setMutationResolver(String mutationResolver) { this.mutationResolver = mutationResolver; } + public String getSubscriptionResolver() { + return subscriptionResolver; + } + public void setSubscriptionResolver(String subscriptionResolver) { this.subscriptionResolver = subscriptionResolver; } + public String getResolver() { + return resolver; + } + public void setResolver(String resolver) { this.resolver = resolver; } diff --git a/plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/SchemaFinderConfig.java b/plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/SchemaFinderConfig.java index ed9446afb..993dba7ca 100644 --- a/plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/SchemaFinderConfig.java +++ b/plugins/maven/graphql-java-codegen-maven-plugin/src/main/java/io/github/kobylynskyi/graphql/codegen/SchemaFinderConfig.java @@ -5,6 +5,9 @@ import java.util.Collections; import java.util.Set; +/** + * Configuration of dynamic GraphQL schema finder + */ public class SchemaFinderConfig { private String rootDir; diff --git a/plugins/sbt/README.md b/plugins/sbt/README.md index 03ede453e..3138d86c8 100644 --- a/plugins/sbt/README.md +++ b/plugins/sbt/README.md @@ -2,24 +2,22 @@ This is a sbt plugin for https://github.com/kobylynskyi/graphql-java-codegen -Server example at https://github.com/jxnu-liguobin/springboot-examples/tree/master/graphql-complete (do not use plugin, only a normal graphql server ) - +Server example at https://github.com/jxnu-liguobin/springboot-examples/tree/master/graphql-complete (do not use plugin, +only a normal graphql server ) ![Build](https://github.com/kobylynskyi/graphql-java-codegen/workflows/Build/badge.svg) [![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.github.jxnu-liguobin/graphql-codegen-sbt-plugin/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.github.jxnu-liguobin/graphql-codegen-sbt-plugin) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) - ### Plugin Setup - ```scala // plugins.sbt addSbtPlugin("io.github.jxnu-liguobin" % "graphql-codegen-sbt-plugin" % "") // since graphql-java-codegen V2.2.1 ``` > Java code will be generated by default, via set `generatedLanguage =: GeneratedLanguage.SCALA` to generate Scala code (since 4.0.0). By the way, Scala code is currently ugly. - + ### Config for generating scala code Options example in ```build.sbt``` @@ -60,22 +58,22 @@ generateToString := true ### Codegen Options +SBT task -SBT task - -1. graphqlSchemaValidate - - use validate at terminal by user, can get args from terminal, such as `graphqlSchemaValidate src/main/resources/schema.graphqls`, args split with space -2. graphqlCodegen +1. graphqlSchemaValidate + - use validate at terminal by user, can get args from terminal, such + as `graphqlSchemaValidate src/main/resources/schema.graphqls`, args split with space +2. graphqlCodegen - generate java code from graphql schema -3. graphqlCodegenValidate +3. graphqlCodegenValidate - use validate schemas that config in build.sbt key: `graphqlSchemaPaths` - ### Plugin Options - Please refer to [Codegen Options](../../docs/codegen-options.md) -> in sbt plugin option +> in sbt plugin option + - `packageName` was rename to `generatePackageName` -- `generateCodegenTargetPath` Where to store generated files and add the generated code to the classpath, so that they can be referenced. since 3.0.0 . \ No newline at end of file +- `generateCodegenTargetPath` Where to store generated files and add the generated code to the classpath, so that they + can be referenced. since 3.0.0 . \ No newline at end of file diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/project/build.properties b/plugins/sbt/graphql-java-codegen-sbt-plugin/project/build.properties index 97a7ea7b3..862afa5f2 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/project/build.properties +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/project/build.properties @@ -1 +1 @@ -sbt.version = 1.4.7 \ No newline at end of file +sbt.version=1.4.7 \ No newline at end of file diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenPlugin.scala b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenPlugin.scala index 610ed71cc..50841acfa 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenPlugin.scala +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/main/scala/io/github/dreamylost/graphql/codegen/GraphQLCodegenPlugin.scala @@ -202,18 +202,19 @@ class GraphQLCodegenPlugin(configuration: Configuration, private[codegen] val co }, graphqlCodegen := { sLog.value.info(s"Generating files: ${BuildInfo.toString}") val mappingConfigSupplier = buildJsonSupplier(jsonConfigurationFile.value.orNull) + val language = mappingConfigSupplier.map(_.get()).map(_.getGeneratedLanguage).getOrElse(generatedLanguage.value) var result = Seq.empty[File] try { val _outputDir = outputDir.value val _introspectionResult = graphqlQueryIntrospectionResultPath.value.orNull lazy val instantiateCodegen = (mappingConfig: MappingConfig) => { - generatedLanguage.value match { + language match { case JAVA => - new JavaGraphQLCodegen(getSchemas(), _introspectionResult, _outputDir, mappingConfig, mappingConfigSupplier) + new JavaGraphQLCodegen(getSchemas(), _introspectionResult, _outputDir, mappingConfig, mappingConfigSupplier.orNull) case SCALA => - new ScalaGraphQLCodegen(getSchemas(), _introspectionResult, _outputDir, mappingConfig, mappingConfigSupplier) + new ScalaGraphQLCodegen(getSchemas(), _introspectionResult, _outputDir, mappingConfig, mappingConfigSupplier.orNull) case _ => - throw new LanguageNotSupportedException(generatedLanguage.value) + throw new LanguageNotSupportedException(language) } } result = instantiateCodegen(getMappingConfig().value).generate.asScala @@ -274,9 +275,9 @@ class GraphQLCodegenPlugin(configuration: Configuration, private[codegen] val co ) ++ watchSourcesSetting ++ Seq(cleanFiles += generateCodegenTargetPath.value) } - protected def buildJsonSupplier(jsonConfigurationFile: String): JsonMappingConfigSupplier = { + protected def buildJsonSupplier(jsonConfigurationFile: String): Option[JsonMappingConfigSupplier] = { if (jsonConfigurationFile != null && jsonConfigurationFile.nonEmpty) - new JsonMappingConfigSupplier(jsonConfigurationFile) else null + Some(new JsonMappingConfigSupplier(jsonConfigurationFile)) else None } } diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/project/build.properties b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/project/build.properties index 97a7ea7b3..862afa5f2 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/project/build.properties +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/project/build.properties @@ -1 +1 @@ -sbt.version = 1.4.7 \ No newline at end of file +sbt.version=1.4.7 \ No newline at end of file diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/project/plugins.sbt b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/project/plugins.sbt index 6da4acca6..66de85c82 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/project/plugins.sbt +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/project/plugins.sbt @@ -1 +1 @@ -addSbtPlugin("io.github.jxnu-liguobin" % "graphql-codegen-sbt-plugin" % "4.1.4") +addSbtPlugin("io.github.jxnu-liguobin" % "graphql-codegen-sbt-plugin" % "4.1.5-SNAPSHOT") diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/version.sbt b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/version.sbt index ab24ad788..a28cbe1b3 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/version.sbt +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client-scala/version.sbt @@ -1 +1 @@ -version in ThisBuild := "4.1.4" +version in ThisBuild := "4.1.5-SNAPSHOT" diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/project/build.properties b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/project/build.properties index 97a7ea7b3..862afa5f2 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/project/build.properties +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/project/build.properties @@ -1 +1 @@ -sbt.version = 1.4.7 \ No newline at end of file +sbt.version=1.4.7 \ No newline at end of file diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/project/plugins.sbt b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/project/plugins.sbt index 6da4acca6..66de85c82 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/project/plugins.sbt +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/project/plugins.sbt @@ -1 +1 @@ -addSbtPlugin("io.github.jxnu-liguobin" % "graphql-codegen-sbt-plugin" % "4.1.4") +addSbtPlugin("io.github.jxnu-liguobin" % "graphql-codegen-sbt-plugin" % "4.1.5-SNAPSHOT") diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/version.sbt b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/version.sbt index ab24ad788..a28cbe1b3 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/version.sbt +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/example-client/version.sbt @@ -1 +1 @@ -version in ThisBuild := "4.1.4" +version in ThisBuild := "4.1.5-SNAPSHOT" diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/project/build.properties b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/project/build.properties index 97a7ea7b3..862afa5f2 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/project/build.properties +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/project/build.properties @@ -1 +1 @@ -sbt.version = 1.4.7 \ No newline at end of file +sbt.version=1.4.7 \ No newline at end of file diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/project/plugins.sbt b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/project/plugins.sbt index 599ca21bd..2b2ac967e 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/project/plugins.sbt +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/project/plugins.sbt @@ -1,4 +1,4 @@ -sys.props.get("plugin.version").orElse(Some("4.1.4")) match { +sys.props.get("plugin.version").orElse(Some("4.1.5-SNAPSHOT")) match { case Some(x) => addSbtPlugin("io.github.jxnu-liguobin" % "graphql-codegen-sbt-plugin" % x) case _ => sys.error("""|The system property 'plugin.version' is not defined. |Specify this property using the scriptedLaunchOpts -D.""".stripMargin) diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/version.sbt b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/version.sbt index ab24ad788..a28cbe1b3 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/version.sbt +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/src/sbt-test/graphql-codegen-sbt-plugin/simple/version.sbt @@ -1 +1 @@ -version in ThisBuild := "4.1.4" +version in ThisBuild := "4.1.5-SNAPSHOT" diff --git a/plugins/sbt/graphql-java-codegen-sbt-plugin/version.sbt b/plugins/sbt/graphql-java-codegen-sbt-plugin/version.sbt index ab24ad788..a28cbe1b3 100644 --- a/plugins/sbt/graphql-java-codegen-sbt-plugin/version.sbt +++ b/plugins/sbt/graphql-java-codegen-sbt-plugin/version.sbt @@ -1 +1 @@ -version in ThisBuild := "4.1.4" +version in ThisBuild := "4.1.5-SNAPSHOT" diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/FreeMarkerTemplatesRegistry.java b/src/main/java/com/kobylynskyi/graphql/codegen/FreeMarkerTemplatesRegistry.java index d9abd0b7d..3bf1cebe1 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/FreeMarkerTemplatesRegistry.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/FreeMarkerTemplatesRegistry.java @@ -24,7 +24,9 @@ class FreeMarkerTemplatesRegistry { private static final Version FREEMARKER_TEMPLATE_VERSION = Configuration.VERSION_2_3_30; - private static final EnumMap> templateMap = new EnumMap<>(GeneratedLanguage.class); + private static final EnumMap> templateMap = + new EnumMap<>( + GeneratedLanguage.class); static { BeansWrapper beansWrapper = new BeansWrapper(FREEMARKER_TEMPLATE_VERSION); @@ -38,39 +40,66 @@ class FreeMarkerTemplatesRegistry { try { EnumMap javaTemplates = new EnumMap<>(FreeMarkerTemplateType.class); - javaTemplates.put(TYPE, configuration.getTemplate("templates/java-lang/javaClassGraphqlType.ftl")); - javaTemplates.put(ENUM, configuration.getTemplate("templates/java-lang/javaClassGraphqlEnum.ftl")); - javaTemplates.put(UNION, configuration.getTemplate("templates/java-lang/javaClassGraphqlUnion.ftl")); - javaTemplates.put(REQUEST, configuration.getTemplate("templates/java-lang/javaClassGraphqlRequest.ftl")); - javaTemplates.put(RESPONSE, configuration.getTemplate("templates/java-lang/javaClassGraphqlResponse.ftl")); - javaTemplates.put(INTERFACE, configuration.getTemplate("templates/java-lang/javaClassGraphqlInterface.ftl")); - javaTemplates.put(OPERATIONS, configuration.getTemplate("templates/java-lang/javaClassGraphqlOperations.ftl")); - javaTemplates.put(PARAMETRIZED_INPUT, configuration.getTemplate("templates/java-lang/javaClassGraphqlParametrizedInput.ftl")); - javaTemplates.put(RESPONSE_PROJECTION, configuration.getTemplate("templates/java-lang/javaClassGraphqlResponseProjection.ftl")); + javaTemplates.put(TYPE, + configuration.getTemplate("templates/java-lang/javaClassGraphqlType.ftl")); + javaTemplates.put(ENUM, + configuration.getTemplate("templates/java-lang/javaClassGraphqlEnum.ftl")); + javaTemplates.put(UNION, + configuration.getTemplate("templates/java-lang/javaClassGraphqlUnion.ftl")); + javaTemplates.put(REQUEST, + configuration.getTemplate("templates/java-lang/javaClassGraphqlRequest.ftl")); + javaTemplates.put(RESPONSE, + configuration.getTemplate("templates/java-lang/javaClassGraphqlResponse.ftl")); + javaTemplates.put(INTERFACE, + configuration.getTemplate("templates/java-lang/javaClassGraphqlInterface.ftl")); + javaTemplates.put(OPERATIONS, + configuration.getTemplate("templates/java-lang/javaClassGraphqlOperations.ftl")); + javaTemplates.put(PARAMETRIZED_INPUT, + configuration.getTemplate("templates/java-lang/javaClassGraphqlParametrizedInput.ftl")); + javaTemplates.put(RESPONSE_PROJECTION, + configuration.getTemplate("templates/java-lang/javaClassGraphqlResponseProjection.ftl")); templateMap.put(GeneratedLanguage.JAVA, javaTemplates); EnumMap scalaTemplates = new EnumMap<>(FreeMarkerTemplateType.class); - scalaTemplates.put(TYPE, configuration.getTemplate("templates/scala-lang/scalaClassGraphqlType.ftl")); - scalaTemplates.put(ENUM, configuration.getTemplate("templates/scala-lang/scalaClassGraphqlEnum.ftl")); - scalaTemplates.put(UNION, configuration.getTemplate("templates/scala-lang/scalaClassGraphqlUnion.ftl")); - scalaTemplates.put(REQUEST, configuration.getTemplate("templates/scala-lang/scalaClassGraphqlRequest.ftl")); - scalaTemplates.put(RESPONSE, configuration.getTemplate("templates/scala-lang/scalaClassGraphqlResponse.ftl")); - scalaTemplates.put(INTERFACE, configuration.getTemplate("templates/scala-lang/scalaClassGraphqlInterface.ftl")); - scalaTemplates.put(OPERATIONS, configuration.getTemplate("templates/scala-lang/scalaClassGraphqlOperations.ftl")); - scalaTemplates.put(PARAMETRIZED_INPUT, configuration.getTemplate("templates/scala-lang/scalaClassGraphqlParametrizedInput.ftl")); - scalaTemplates.put(RESPONSE_PROJECTION, configuration.getTemplate("templates/scala-lang/scalaClassGraphqlResponseProjection.ftl")); + scalaTemplates.put(TYPE, + configuration.getTemplate("templates/scala-lang/scalaClassGraphqlType.ftl")); + scalaTemplates.put(ENUM, + configuration.getTemplate("templates/scala-lang/scalaClassGraphqlEnum.ftl")); + scalaTemplates.put(UNION, + configuration.getTemplate("templates/scala-lang/scalaClassGraphqlUnion.ftl")); + scalaTemplates.put(REQUEST, + configuration.getTemplate("templates/scala-lang/scalaClassGraphqlRequest.ftl")); + scalaTemplates.put(RESPONSE, + configuration.getTemplate("templates/scala-lang/scalaClassGraphqlResponse.ftl")); + scalaTemplates.put(INTERFACE, + configuration.getTemplate("templates/scala-lang/scalaClassGraphqlInterface.ftl")); + scalaTemplates.put(OPERATIONS, + configuration.getTemplate("templates/scala-lang/scalaClassGraphqlOperations.ftl")); + scalaTemplates.put(PARAMETRIZED_INPUT, + configuration.getTemplate("templates/scala-lang/scalaClassGraphqlParametrizedInput.ftl")); + scalaTemplates.put(RESPONSE_PROJECTION, + configuration.getTemplate("templates/scala-lang/scalaClassGraphqlResponseProjection.ftl")); templateMap.put(GeneratedLanguage.SCALA, scalaTemplates); EnumMap kotlinTemplates = new EnumMap<>(FreeMarkerTemplateType.class); - kotlinTemplates.put(TYPE, configuration.getTemplate("templates/kotlin-lang/kotlinClassGraphqlType.ftl")); - kotlinTemplates.put(ENUM, configuration.getTemplate("templates/kotlin-lang/kotlinClassGraphqlEnum.ftl")); - kotlinTemplates.put(UNION, configuration.getTemplate("templates/kotlin-lang/kotlinClassGraphqlUnion.ftl")); - kotlinTemplates.put(REQUEST, configuration.getTemplate("templates/kotlin-lang/kotlinClassGraphqlRequest.ftl")); - kotlinTemplates.put(RESPONSE, configuration.getTemplate("templates/kotlin-lang/kotlinClassGraphqlResponse.ftl")); - kotlinTemplates.put(INTERFACE, configuration.getTemplate("templates/kotlin-lang/kotlinClassGraphqlInterface.ftl")); - kotlinTemplates.put(OPERATIONS, configuration.getTemplate("templates/kotlin-lang/kotlinClassGraphqlOperations.ftl")); - kotlinTemplates.put(PARAMETRIZED_INPUT, configuration.getTemplate("templates/kotlin-lang/kotlinClassGraphqlParametrizedInput.ftl")); - kotlinTemplates.put(RESPONSE_PROJECTION, configuration.getTemplate("templates/kotlin-lang/kotlinClassGraphqlResponseProjection.ftl")); + kotlinTemplates.put(TYPE, + configuration.getTemplate("templates/kotlin-lang/kotlinClassGraphqlType.ftl")); + kotlinTemplates.put(ENUM, + configuration.getTemplate("templates/kotlin-lang/kotlinClassGraphqlEnum.ftl")); + kotlinTemplates.put(UNION, + configuration.getTemplate("templates/kotlin-lang/kotlinClassGraphqlUnion.ftl")); + kotlinTemplates.put(REQUEST, + configuration.getTemplate("templates/kotlin-lang/kotlinClassGraphqlRequest.ftl")); + kotlinTemplates.put(RESPONSE, + configuration.getTemplate("templates/kotlin-lang/kotlinClassGraphqlResponse.ftl")); + kotlinTemplates.put(INTERFACE, + configuration.getTemplate("templates/kotlin-lang/kotlinClassGraphqlInterface.ftl")); + kotlinTemplates.put(OPERATIONS, + configuration.getTemplate("templates/kotlin-lang/kotlinClassGraphqlOperations.ftl")); + kotlinTemplates.put(PARAMETRIZED_INPUT, + configuration.getTemplate("templates/kotlin-lang/kotlinClassGraphqlParametrizedInput.ftl")); + kotlinTemplates.put(RESPONSE_PROJECTION, + configuration.getTemplate("templates/kotlin-lang/kotlinClassGraphqlResponseProjection.ftl")); templateMap.put(GeneratedLanguage.KOTLIN, kotlinTemplates); } catch (IOException e) { throw new UnableToLoadFreeMarkerTemplateException(e); @@ -80,7 +109,8 @@ class FreeMarkerTemplatesRegistry { private FreeMarkerTemplatesRegistry() { } - public static Template getTemplateWithLang(GeneratedLanguage generatedLanguage, FreeMarkerTemplateType templateType) { + public static Template getTemplateWithLang(GeneratedLanguage generatedLanguage, + FreeMarkerTemplateType templateType) { return templateMap.get(generatedLanguage).get(templateType); } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/GraphQLCodegen.java b/src/main/java/com/kobylynskyi/graphql/codegen/GraphQLCodegen.java index 4ed199b16..06ed30da1 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/GraphQLCodegen.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/GraphQLCodegen.java @@ -76,7 +76,8 @@ protected GraphQLCodegen(List schemas, MappingConfig mappingConfig, MappingConfigSupplier externalMappingConfigSupplier, MapperFactory mapperFactory) { - this(schemas, introspectionResult, outputDir, mappingConfig, externalMappingConfigSupplier, new GeneratedInformation(), mapperFactory); + this(schemas, introspectionResult, outputDir, mappingConfig, externalMappingConfigSupplier, + new GeneratedInformation(), mapperFactory); } // used by other constructors @@ -163,25 +164,30 @@ protected void initDefaultValues(MappingConfig mappingConfig) { mappingConfig.setTypeResolverSuffix(MappingConfigConstants.DEFAULT_RESOLVER_SUFFIX); } if (mappingConfig.getGenerateParameterizedFieldsResolvers() == null) { - mappingConfig.setGenerateParameterizedFieldsResolvers(MappingConfigConstants.DEFAULT_GENERATE_PARAMETERIZED_FIELDS_RESOLVERS); + mappingConfig.setGenerateParameterizedFieldsResolvers( + MappingConfigConstants.DEFAULT_GENERATE_PARAMETERIZED_FIELDS_RESOLVERS); } if (mappingConfig.getGenerateExtensionFieldsResolvers() == null) { - mappingConfig.setGenerateExtensionFieldsResolvers(MappingConfigConstants.DEFAULT_GENERATE_EXTENSION_FIELDS_RESOLVERS); + mappingConfig.setGenerateExtensionFieldsResolvers( + MappingConfigConstants.DEFAULT_GENERATE_EXTENSION_FIELDS_RESOLVERS); } if (mappingConfig.getGenerateDataFetchingEnvironmentArgumentInApis() == null) { - mappingConfig.setGenerateDataFetchingEnvironmentArgumentInApis(MappingConfigConstants.DEFAULT_GENERATE_DATA_FETCHING_ENV); + mappingConfig.setGenerateDataFetchingEnvironmentArgumentInApis( + MappingConfigConstants.DEFAULT_GENERATE_DATA_FETCHING_ENV); } if (mappingConfig.getGenerateModelsForRootTypes() == null) { mappingConfig.setGenerateModelsForRootTypes(MappingConfigConstants.DEFAULT_GENERATE_MODELS_FOR_ROOT_TYPES); } if (mappingConfig.getGenerateApisWithThrowsException() == null) { - mappingConfig.setGenerateApisWithThrowsException(MappingConfigConstants.DEFAULT_GENERATE_APIS_WITH_THROWS_EXCEPTION); + mappingConfig.setGenerateApisWithThrowsException( + MappingConfigConstants.DEFAULT_GENERATE_APIS_WITH_THROWS_EXCEPTION); } if (mappingConfig.getAddGeneratedAnnotation() == null) { mappingConfig.setAddGeneratedAnnotation(MappingConfigConstants.DEFAULT_ADD_GENERATED_ANNOTATION); } if (mappingConfig.getUseOptionalForNullableReturnTypes() == null) { - mappingConfig.setUseOptionalForNullableReturnTypes(MappingConfigConstants.DEFAULT_USE_OPTIONAL_FOR_NULLABLE_RETURN_TYPES); + mappingConfig.setUseOptionalForNullableReturnTypes( + MappingConfigConstants.DEFAULT_USE_OPTIONAL_FOR_NULLABLE_RETURN_TYPES); } if (mappingConfig.getApiNamePrefixStrategy() == null) { mappingConfig.setApiNamePrefixStrategy(MappingConfigConstants.DEFAULT_API_NAME_PREFIX_STRATEGY); @@ -208,7 +214,8 @@ private void validateConfigs(MappingConfig mappingConfig) { if (!Utils.isEmpty(schemas) && introspectionResult != null || (Utils.isEmpty(schemas) && introspectionResult == null)) { // either schemas or introspection result should be provided - throw new IllegalArgumentException("Either graphql schema path or introspection result path should be supplied"); + throw new IllegalArgumentException( + "Either graphql schema path or introspection result path should be supplied"); } if (mappingConfig.getApiRootInterfaceStrategy() == ApiRootInterfaceStrategy.INTERFACE_PER_SCHEMA && mappingConfig.getApiNamePrefixStrategy() == ApiNamePrefixStrategy.CONSTANT) { @@ -219,20 +226,33 @@ private void validateConfigs(MappingConfig mappingConfig) { && Boolean.TRUE.equals(mappingConfig.getGenerateModelsForRootTypes()) && mappingConfig.getApiNamePrefixStrategy() == ApiNamePrefixStrategy.CONSTANT) { // checking for conflict between root type model classes and api interfaces - if (Utils.stringsEqualIgnoreSpaces(mappingConfig.getApiNamePrefix(), mappingConfig.getModelNamePrefix()) && - Utils.stringsEqualIgnoreSpaces(mappingConfig.getApiNameSuffix(), mappingConfig.getModelNameSuffix())) { + if (Utils.stringsEqualIgnoreSpaces( + mappingConfig.getApiNamePrefix(), mappingConfig.getModelNamePrefix()) && + Utils.stringsEqualIgnoreSpaces( + mappingConfig.getApiNameSuffix(), mappingConfig.getModelNameSuffix())) { // we will have a conflict between model pojo (Query.java) and api interface (Query.java) - throw new IllegalArgumentException("Either disable APIs generation or set different Prefix/Suffix for API classes and model classes"); + throw new IllegalArgumentException("Either disable APIs generation or " + + "set different Prefix/Suffix for API classes and model classes"); } // checking for conflict between root type model resolver classes and api interfaces - if (Utils.stringsEqualIgnoreSpaces(mappingConfig.getApiNamePrefix(), mappingConfig.getTypeResolverPrefix()) && - Utils.stringsEqualIgnoreSpaces(mappingConfig.getApiNameSuffix(), mappingConfig.getTypeResolverSuffix())) { - // we will have a conflict between model resolver interface (QueryResolver.java) and api interface resolver (QueryResolver.java) - throw new IllegalArgumentException("Either disable APIs generation or set different Prefix/Suffix for API classes and type resolver classes"); + if (Utils.stringsEqualIgnoreSpaces(mappingConfig.getApiNamePrefix(), + mappingConfig.getTypeResolverPrefix()) && + Utils.stringsEqualIgnoreSpaces(mappingConfig.getApiNameSuffix(), + mappingConfig.getTypeResolverSuffix())) { + // we will have a conflict between model resolver interface (QueryResolver.java) and api interface + // resolver (QueryResolver.java) + throw new IllegalArgumentException("Either disable APIs generation or " + + "set different Prefix/Suffix for API classes and type resolver classes"); } } } + /** + * Generate class files based on GraphQL schema + * + * @return a list of generated classes + * @throws IOException in case some I/O error occurred, e.g.: file can't be created, directory access issues, etc. + */ public List generate() throws IOException { GraphQLCodegenFileCreator.prepareOutputDir(outputDir); long startTime = System.currentTimeMillis(); @@ -244,7 +264,8 @@ public List generate() throws IOException { System.out.printf("Finished processing %d schema(s) in %d ms%n", schemas.size(), System.currentTimeMillis() - startTime); } else if (introspectionResult != null) { - ExtendedDocument document = GraphQLDocumentParser.getDocumentFromIntrospectionResult(mappingConfig, introspectionResult); + ExtendedDocument document = GraphQLDocumentParser + .getDocumentFromIntrospectionResult(mappingConfig, introspectionResult); initCustomTypeMappings(document.getScalarDefinitions()); generatedFiles = processDefinitions(document); System.out.printf("Finished processing introspection result in %d ms%n", @@ -255,7 +276,8 @@ public List generate() throws IOException { } private List processDefinitions(ExtendedDocument document) { - MappingContext context = new MappingContext(mappingConfig, document, generatedInformation, dataModelMapperFactory); + MappingContext context = new MappingContext(mappingConfig, document, generatedInformation, + dataModelMapperFactory); List generatedFiles = new ArrayList<>(); for (ExtendedEnumTypeDefinition extendedEnumTypeDefinition : document.getEnumDefinitions()) { generatedFiles.add(generateEnum(context, extendedEnumTypeDefinition)); @@ -267,7 +289,8 @@ private List processDefinitions(ExtendedDocument document) { generatedFiles.addAll(generateType(context, extendedObjectTypeDefinition)); } for (ExtendedObjectTypeDefinition extendedObjectTypeDefinition : document.getTypeDefinitions()) { - generateFieldResolver(context, extendedObjectTypeDefinition.getFieldDefinitions(), extendedObjectTypeDefinition) + generateFieldResolver(context, extendedObjectTypeDefinition.getFieldDefinitions(), + extendedObjectTypeDefinition) .ifPresent(generatedFiles::add); } for (ExtendedObjectTypeDefinition extendedObjectTypeDefinition : document.getOperationDefinitions()) { @@ -287,42 +310,61 @@ private List processDefinitions(ExtendedDocument document) { for (ExtendedInterfaceTypeDefinition definition : document.getInterfaceDefinitions()) { generateFieldResolver(context, definition.getFieldDefinitions(), definition).ifPresent(generatedFiles::add); } - System.out.printf("Generated %d definition classes in folder %s%n", generatedFiles.size(), outputDir.getAbsolutePath()); + System.out.printf("Generated %d definition classes in folder %s%n", generatedFiles.size(), + outputDir.getAbsolutePath()); return generatedFiles; } private List generateUnion(MappingContext mappingContext, ExtendedUnionTypeDefinition definition) { List generatedFiles = new ArrayList<>(); - Map dataModel = dataModelMapperFactory.getUnionDefinitionMapper().map(mappingContext, definition); - generatedFiles.add(GraphQLCodegenFileCreator.generateFile(mappingContext, FreeMarkerTemplateType.UNION, dataModel, outputDir)); + Map dataModel = dataModelMapperFactory.getUnionDefinitionMapper() + .map(mappingContext, definition); + generatedFiles.add(GraphQLCodegenFileCreator.generateFile( + mappingContext, FreeMarkerTemplateType.UNION, dataModel, outputDir)); if (Boolean.TRUE.equals(mappingConfig.getGenerateClient())) { - Map responseProjDataModel = dataModelMapperFactory.getRequestResponseDefinitionMapper().mapResponseProjection(mappingContext, definition); - generatedFiles.add(GraphQLCodegenFileCreator.generateFile(mappingContext, FreeMarkerTemplateType.RESPONSE_PROJECTION, responseProjDataModel, outputDir)); + Map responseProjDataModel = dataModelMapperFactory.getRequestResponseDefinitionMapper() + .mapResponseProjection(mappingContext, + definition); + generatedFiles.add(GraphQLCodegenFileCreator + .generateFile(mappingContext, FreeMarkerTemplateType.RESPONSE_PROJECTION, + responseProjDataModel, outputDir)); } return generatedFiles; } private List generateInterface(MappingContext mappingContext, ExtendedInterfaceTypeDefinition definition) { List generatedFiles = new ArrayList<>(); - Map dataModel = dataModelMapperFactory.getInterfaceDefinitionMapper().map(mappingContext, definition); - generatedFiles.add(GraphQLCodegenFileCreator.generateFile(mappingContext, FreeMarkerTemplateType.INTERFACE, dataModel, outputDir)); + Map dataModel = dataModelMapperFactory.getInterfaceDefinitionMapper() + .map(mappingContext, definition); + generatedFiles.add(GraphQLCodegenFileCreator + .generateFile(mappingContext, FreeMarkerTemplateType.INTERFACE, dataModel, outputDir)); if (Boolean.TRUE.equals(mappingConfig.getGenerateClient())) { - Map responseProjDataModel = dataModelMapperFactory.getRequestResponseDefinitionMapper().mapResponseProjection(mappingContext, definition); - generatedFiles.add(GraphQLCodegenFileCreator.generateFile(mappingContext, FreeMarkerTemplateType.RESPONSE_PROJECTION, responseProjDataModel, outputDir)); + Map responseProjDataModel = dataModelMapperFactory.getRequestResponseDefinitionMapper() + .mapResponseProjection(mappingContext, + definition); + generatedFiles.add(GraphQLCodegenFileCreator + .generateFile(mappingContext, FreeMarkerTemplateType.RESPONSE_PROJECTION, + responseProjDataModel, outputDir)); for (ExtendedFieldDefinition fieldDefinition : definition.getFieldDefinitions()) { if (!Utils.isEmpty(fieldDefinition.getInputValueDefinitions())) { - Map fieldProjDataModel = dataModelMapperFactory.getRequestResponseDefinitionMapper().mapParametrizedInput(mappingContext, fieldDefinition, definition); - generatedFiles.add(GraphQLCodegenFileCreator.generateFile(mappingContext, FreeMarkerTemplateType.PARAMETRIZED_INPUT, fieldProjDataModel, outputDir)); + Map fieldProjDataModel = dataModelMapperFactory.getRequestResponseDefinitionMapper() + .mapParametrizedInput(mappingContext, + fieldDefinition, + definition); + generatedFiles.add(GraphQLCodegenFileCreator + .generateFile(mappingContext, FreeMarkerTemplateType.PARAMETRIZED_INPUT, + fieldProjDataModel, outputDir)); } } } return generatedFiles; } - private List generateServerOperations(MappingContext mappingContext, ExtendedObjectTypeDefinition definition) { + private List generateServerOperations(MappingContext mappingContext, + ExtendedObjectTypeDefinition definition) { List generatedFiles = new ArrayList<>(); // Generate a root interface with all operations inside // Relates to https://github.com/facebook/relay/issues/112 @@ -342,7 +384,8 @@ private List generateServerOperations(MappingContext mappingContext, Exten if (mappingContext.getApiInterfaceStrategy() == ApiInterfaceStrategy.INTERFACE_PER_OPERATION) { // Generate separate interfaces for all queries, mutations and subscriptions - List fieldNames = definition.getFieldDefinitions().stream().map(FieldDefinition::getName).collect(toList()); + List fieldNames = definition.getFieldDefinitions().stream().map(FieldDefinition::getName) + .collect(toList()); switch (mappingContext.getApiNamePrefixStrategy()) { case FOLDER_NAME_AS_PREFIX: for (ExtendedObjectTypeDefinition fileDef : definition.groupBySourceLocationFolder().values()) { @@ -365,44 +408,71 @@ private List generateServerOperations(MappingContext mappingContext, Exten private List generateClient(MappingContext mappingContext, ExtendedObjectTypeDefinition definition) { List generatedFiles = new ArrayList<>(); - List fieldNames = definition.getFieldDefinitions().stream().map(FieldDefinition::getName).collect(toList()); + List fieldNames = definition.getFieldDefinitions().stream().map(FieldDefinition::getName) + .collect(toList()); for (ExtendedFieldDefinition operationDef : definition.getFieldDefinitions()) { - Map requestDataModel = dataModelMapperFactory.getRequestResponseDefinitionMapper().mapRequest(mappingContext, operationDef, definition.getName(), fieldNames); - generatedFiles.add(GraphQLCodegenFileCreator.generateFile(mappingContext, FreeMarkerTemplateType.REQUEST, requestDataModel, outputDir)); - - Map responseDataModel = dataModelMapperFactory.getRequestResponseDefinitionMapper().mapResponse(mappingContext, operationDef, definition.getName(), fieldNames); - generatedFiles.add(GraphQLCodegenFileCreator.generateFile(mappingContext, FreeMarkerTemplateType.RESPONSE, responseDataModel, outputDir)); + Map requestDataModel = dataModelMapperFactory.getRequestResponseDefinitionMapper() + .mapRequest(mappingContext, operationDef, + definition.getName(), fieldNames); + generatedFiles.add(GraphQLCodegenFileCreator + .generateFile(mappingContext, FreeMarkerTemplateType.REQUEST, requestDataModel, + outputDir)); + + Map responseDataModel = dataModelMapperFactory.getRequestResponseDefinitionMapper() + .mapResponse(mappingContext, operationDef, + definition.getName(), + fieldNames); + generatedFiles.add(GraphQLCodegenFileCreator + .generateFile(mappingContext, FreeMarkerTemplateType.RESPONSE, responseDataModel, + outputDir)); } return generatedFiles; } - private List generateApis(MappingContext mappingContext, ExtendedObjectTypeDefinition definition, List fieldNames) { + private List generateApis(MappingContext mappingContext, ExtendedObjectTypeDefinition definition, + List fieldNames) { List generatedFiles = new ArrayList<>(); for (ExtendedFieldDefinition operationDef : definition.getFieldDefinitions()) { - Map dataModel = dataModelMapperFactory.getFieldDefinitionsToResolverMapper().mapRootTypeField(mappingContext, operationDef, definition.getName(), fieldNames); - generatedFiles.add(GraphQLCodegenFileCreator.generateFile(mappingContext, FreeMarkerTemplateType.OPERATIONS, dataModel, outputDir)); + Map dataModel = dataModelMapperFactory.getFieldDefinitionsToResolverMapper() + .mapRootTypeField(mappingContext, operationDef, + definition.getName(), fieldNames); + generatedFiles.add(GraphQLCodegenFileCreator + .generateFile(mappingContext, FreeMarkerTemplateType.OPERATIONS, dataModel, + outputDir)); } return generatedFiles; } private File generateRootApi(MappingContext mappingContext, ExtendedObjectTypeDefinition definition) { - Map dataModel = dataModelMapperFactory.getFieldDefinitionsToResolverMapper().mapRootTypeFields(mappingContext, definition); - return GraphQLCodegenFileCreator.generateFile(mappingContext, FreeMarkerTemplateType.OPERATIONS, dataModel, outputDir); + Map dataModel = dataModelMapperFactory.getFieldDefinitionsToResolverMapper() + .mapRootTypeFields(mappingContext, definition); + return GraphQLCodegenFileCreator + .generateFile(mappingContext, FreeMarkerTemplateType.OPERATIONS, dataModel, outputDir); } private List generateType(MappingContext mappingContext, ExtendedObjectTypeDefinition definition) { List generatedFiles = new ArrayList<>(); - Map dataModel = dataModelMapperFactory.getTypeDefinitionMapper().map(mappingContext, definition); - generatedFiles.add(GraphQLCodegenFileCreator.generateFile(mappingContext, FreeMarkerTemplateType.TYPE, dataModel, outputDir)); + Map dataModel = dataModelMapperFactory.getTypeDefinitionMapper() + .map(mappingContext, definition); + generatedFiles.add(GraphQLCodegenFileCreator.generateFile(mappingContext, + FreeMarkerTemplateType.TYPE, dataModel, outputDir)); if (Boolean.TRUE.equals(mappingConfig.getGenerateClient())) { - Map responseProjDataModel = dataModelMapperFactory.getRequestResponseDefinitionMapper().mapResponseProjection(mappingContext, definition); - generatedFiles.add(GraphQLCodegenFileCreator.generateFile(mappingContext, FreeMarkerTemplateType.RESPONSE_PROJECTION, responseProjDataModel, outputDir)); + Map responseProjDataModel = dataModelMapperFactory.getRequestResponseDefinitionMapper() + .mapResponseProjection(mappingContext, + definition); + generatedFiles.add(GraphQLCodegenFileCreator + .generateFile(mappingContext, FreeMarkerTemplateType.RESPONSE_PROJECTION, + responseProjDataModel, outputDir)); for (ExtendedFieldDefinition fieldDefinition : definition.getFieldDefinitions()) { if (!Utils.isEmpty(fieldDefinition.getInputValueDefinitions())) { - Map fieldProjDataModel = dataModelMapperFactory.getRequestResponseDefinitionMapper().mapParametrizedInput(mappingContext, fieldDefinition, definition); - generatedFiles.add(GraphQLCodegenFileCreator.generateFile(mappingContext, FreeMarkerTemplateType.PARAMETRIZED_INPUT, fieldProjDataModel, outputDir)); + Map fieldProjDataModel = + dataModelMapperFactory.getRequestResponseDefinitionMapper() + .mapParametrizedInput(mappingContext, fieldDefinition, definition); + generatedFiles.add(GraphQLCodegenFileCreator + .generateFile(mappingContext, FreeMarkerTemplateType.PARAMETRIZED_INPUT, + fieldProjDataModel, outputDir)); } } } @@ -414,24 +484,37 @@ private Optional generateFieldResolver(MappingContext mappingContext, ExtendedDefinition parentDefinition) { if (Boolean.TRUE.equals(mappingConfig.getGenerateApis())) { List fieldDefsWithResolvers = fieldDefinitions.stream() - .filter(fieldDef -> FieldDefinitionToParameterMapper.generateResolversForField(mappingContext, fieldDef, parentDefinition)) + .filter( + fieldDef -> FieldDefinitionToParameterMapper + .generateResolversForField( + mappingContext, fieldDef, + parentDefinition)) .collect(toList()); if (!fieldDefsWithResolvers.isEmpty()) { - Map dataModel = dataModelMapperFactory.getFieldDefinitionsToResolverMapper().mapToTypeResolver(mappingContext, fieldDefsWithResolvers, parentDefinition.getName()); - return Optional.of(GraphQLCodegenFileCreator.generateFile(mappingContext, FreeMarkerTemplateType.OPERATIONS, dataModel, outputDir)); + Map dataModel = dataModelMapperFactory.getFieldDefinitionsToResolverMapper() + .mapToTypeResolver(mappingContext, + fieldDefsWithResolvers, + parentDefinition.getName()); + return Optional.of(GraphQLCodegenFileCreator + .generateFile(mappingContext, FreeMarkerTemplateType.OPERATIONS, dataModel, + outputDir)); } } return Optional.empty(); } private File generateInput(MappingContext mappingContext, ExtendedInputObjectTypeDefinition definition) { - Map dataModel = dataModelMapperFactory.getInputDefinitionMapper().map(mappingContext, definition); - return GraphQLCodegenFileCreator.generateFile(mappingContext, FreeMarkerTemplateType.TYPE, dataModel, outputDir); + Map dataModel = dataModelMapperFactory.getInputDefinitionMapper() + .map(mappingContext, definition); + return GraphQLCodegenFileCreator + .generateFile(mappingContext, FreeMarkerTemplateType.TYPE, dataModel, outputDir); } private File generateEnum(MappingContext mappingContext, ExtendedEnumTypeDefinition definition) { - Map dataModel = dataModelMapperFactory.getEnumDefinitionMapper().map(mappingContext, definition); - return GraphQLCodegenFileCreator.generateFile(mappingContext, FreeMarkerTemplateType.ENUM, dataModel, outputDir); + Map dataModel = dataModelMapperFactory.getEnumDefinitionMapper() + .map(mappingContext, definition); + return GraphQLCodegenFileCreator + .generateFile(mappingContext, FreeMarkerTemplateType.ENUM, dataModel, outputDir); } protected void initCustomTypeMappings(Collection scalarTypeDefinitions) { diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFileCreator.java b/src/main/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFileCreator.java index 2c2489a97..21428b230 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFileCreator.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFileCreator.java @@ -22,7 +22,8 @@ class GraphQLCodegenFileCreator { private GraphQLCodegenFileCreator() { } - static File generateFile(MappingContext mappingContext, FreeMarkerTemplateType templateType, Map dataModel, File outputDir) { + static File generateFile(MappingContext mappingContext, FreeMarkerTemplateType templateType, + Map dataModel, File outputDir) { GeneratedLanguage language = mappingContext.getGeneratedLanguage(); String fileName = dataModel.get(DataModelFields.CLASS_NAME) + language.getFileExtension(); File fileOutputDir = getFileTargetDirectory(dataModel, outputDir); diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/GraphQLDocumentParser.java b/src/main/java/com/kobylynskyi/graphql/codegen/GraphQLDocumentParser.java index 6abb79299..6f2bd2109 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/GraphQLDocumentParser.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/GraphQLDocumentParser.java @@ -41,7 +41,8 @@ class GraphQLDocumentParser { private GraphQLDocumentParser() { } - static ExtendedDocument getDocumentFromSchemas(MappingConfig mappingConfig, List schemaPaths) throws IOException { + static ExtendedDocument getDocumentFromSchemas(MappingConfig mappingConfig, List schemaPaths) + throws IOException { Document document = readDocument(schemaPaths); ExtendedDocumentBuilder extendedDocumentBuilder = new ExtendedDocumentBuilder(); @@ -52,10 +53,12 @@ static ExtendedDocument getDocumentFromSchemas(MappingConfig mappingConfig, List return extendedDocumentBuilder.build(); } - static ExtendedDocument getDocumentFromIntrospectionResult(MappingConfig mappingConfig, String introspectionResult) throws IOException { + static ExtendedDocument getDocumentFromIntrospectionResult(MappingConfig mappingConfig, String introspectionResult) + throws IOException { String introspectionResultContent = Utils.getFileContent(introspectionResult); Map introspectionResultMap = Utils.OBJECT_MAPPER.readValue(introspectionResultContent, - new TypeReference>() { + new TypeReference>() { }); // unwrapping "data" (in case such GraphQL response supplied) if (introspectionResultMap.containsKey("data")) { @@ -71,7 +74,8 @@ static ExtendedDocument getDocumentFromIntrospectionResult(MappingConfig mapping return extendedDocumentBuilder.build(); } - private static void processDefinition(MappingConfig mappingConfig, ExtendedDocumentBuilder extendedDocumentBuilder, Definition definition) { + private static void processDefinition(MappingConfig mappingConfig, ExtendedDocumentBuilder extendedDocumentBuilder, + Definition definition) { if (!(definition instanceof NamedNode)) { // the only definition that does not have a name is SchemaDefinition, so skipping it return; diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaDataModelMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaDataModelMapper.java index 9b8d82b89..68e707601 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaDataModelMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaDataModelMapper.java @@ -8,6 +8,9 @@ import java.util.HashSet; import java.util.Set; +/** + * Data model mapper for JAVA generated classes + */ public class JavaDataModelMapper implements DataModelMapper { private static final Set JAVA_RESTRICTED_KEYWORDS = new HashSet<>(Arrays.asList( diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaGraphQLCodegen.java b/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaGraphQLCodegen.java index 938e4e1cf..aee3dcb8b 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaGraphQLCodegen.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaGraphQLCodegen.java @@ -11,24 +11,34 @@ import java.util.Collection; import java.util.List; +/** + * Class having only Java-specific methods for code-generation + * Most of the logic is still residing in the parent class + */ public class JavaGraphQLCodegen extends GraphQLCodegen { private static final MapperFactory MAPPER_FACTORY = new JavaMapperFactoryImpl(); - public JavaGraphQLCodegen(List schemas, File outputDir, MappingConfig mappingConfig, GeneratedInformation generatedInformation) { + public JavaGraphQLCodegen(List schemas, File outputDir, MappingConfig mappingConfig, + GeneratedInformation generatedInformation) { super(schemas, outputDir, mappingConfig, generatedInformation, MAPPER_FACTORY); } - public JavaGraphQLCodegen(String introspectionResult, File outputDir, MappingConfig mappingConfig, GeneratedInformation generatedInformation) { + public JavaGraphQLCodegen(String introspectionResult, File outputDir, MappingConfig mappingConfig, + GeneratedInformation generatedInformation) { super(introspectionResult, outputDir, mappingConfig, generatedInformation, MAPPER_FACTORY); } - public JavaGraphQLCodegen(List schemas, String introspectionResult, File outputDir, MappingConfig mappingConfig, MappingConfigSupplier externalMappingConfigSupplier) { + public JavaGraphQLCodegen(List schemas, String introspectionResult, File outputDir, + MappingConfig mappingConfig, MappingConfigSupplier externalMappingConfigSupplier) { super(schemas, introspectionResult, outputDir, mappingConfig, externalMappingConfigSupplier, MAPPER_FACTORY); } - public JavaGraphQLCodegen(List schemas, String introspectionResult, File outputDir, MappingConfig mappingConfig, MappingConfigSupplier externalMappingConfigSupplier, GeneratedInformation generatedInformation) { - super(schemas, introspectionResult, outputDir, mappingConfig, externalMappingConfigSupplier, generatedInformation, MAPPER_FACTORY); + public JavaGraphQLCodegen(List schemas, String introspectionResult, File outputDir, + MappingConfig mappingConfig, MappingConfigSupplier externalMappingConfigSupplier, + GeneratedInformation generatedInformation) { + super(schemas, introspectionResult, outputDir, mappingConfig, externalMappingConfigSupplier, + generatedInformation, MAPPER_FACTORY); } @Override diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaGraphQLTypeMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaGraphQLTypeMapper.java index 6ed0a247e..d543aaa23 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaGraphQLTypeMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaGraphQLTypeMapper.java @@ -14,6 +14,9 @@ import static java.util.Arrays.asList; +/** + * Mapper class for converting GraphQL types to Java types + */ public class JavaGraphQLTypeMapper implements GraphQLTypeMapper { public static final String JAVA_UTIL_LIST = "java.util.List"; @@ -41,6 +44,16 @@ public String wrapSuperTypeIntoList(MappingContext mappingContext, String type, return getGenericsString(mappingContext, JAVA_UTIL_LIST, "? extends " + type); } + /** + * Wrap return type of the API interface with generics and/or Optional and/or apiReturnType + * (as specified in the mapping configuration) + * + * @param mappingContext Global mapping context + * @param namedDefinition Named definition + * @param parentTypeName Name of the parent type + * @return API interface name + */ + @Override public String wrapApiReturnTypeIfRequired(MappingContext mappingContext, NamedDefinition namedDefinition, String parentTypeName) { diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaMapperFactoryImpl.java b/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaMapperFactoryImpl.java index bb4896211..41e8d3bee 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaMapperFactoryImpl.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaMapperFactoryImpl.java @@ -6,6 +6,9 @@ import com.kobylynskyi.graphql.codegen.mapper.ValueFormatter; import com.kobylynskyi.graphql.codegen.mapper.ValueMapper; +/** + * A factory of various mappers for Java language + */ public class JavaMapperFactoryImpl implements MapperFactory { @Override diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaValueFormatter.java b/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaValueFormatter.java index 86e7297ad..3ad18bbd0 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaValueFormatter.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/java/JavaValueFormatter.java @@ -4,6 +4,9 @@ import java.util.StringJoiner; +/** + * Class contains various formatting logic that is specific only for Java language + */ public class JavaValueFormatter implements ValueFormatter { @Override diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/kotlin/KotlinDataModelMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/kotlin/KotlinDataModelMapper.java index 595c9838d..40c9076ba 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/kotlin/KotlinDataModelMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/kotlin/KotlinDataModelMapper.java @@ -12,19 +12,22 @@ import static com.kobylynskyi.graphql.codegen.utils.Utils.wrapString; /** + * Data model mapper for KOTLIN generated classes + * * @author 梦境迷离 * @since 2020/12/09 */ public class KotlinDataModelMapper implements DataModelMapper { private static final String RESTRICTED_KEYWORDS_WRAP_WITH = "`"; - private static final Set KOTLIN_RESTRICTED_KEYWORDS = new HashSet<>(Arrays.asList("package", "interface", "class", - "object", "super", "null", "this", "typealias", "as", "as?", "if", "else", "true", "false", "while", "do", - "for", "when", "break", "continue", "return", "fun", "in", "!in", "is", "!is", "throw", "try", "val", "var", - "typeof")); + private static final Set KOTLIN_RESTRICTED_KEYWORDS = new HashSet<>( + Arrays.asList("package", "interface", "class", "object", "super", "null", "this", "typealias", "as", "as?", + "if", "else", "true", "false", "while", "do", "for", "when", "break", "continue", "return", + "fun", "in", "!in", "is", "!is", "throw", "try", "val", "var", "typeof")); //TODO maybe have others - private static final Set KOTLIN_RESTRICTED_METHOD_NAMES = new HashSet<>(Arrays.asList("notify", "notifyAll", "wait")); + private static final Set KOTLIN_RESTRICTED_METHOD_NAMES = new HashSet<>( + Arrays.asList("notify", "notifyAll", "wait")); @Override public String capitalizeIfRestricted(MappingContext mappingContext, String fieldName) { diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/kotlin/KotlinGraphQLCodegen.java b/src/main/java/com/kobylynskyi/graphql/codegen/kotlin/KotlinGraphQLCodegen.java index a8c8feea0..9934f7de8 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/kotlin/KotlinGraphQLCodegen.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/kotlin/KotlinGraphQLCodegen.java @@ -12,6 +12,9 @@ import java.util.List; /** + * Class having only Kotlin-specific methods for code-generation + * Most of the logic is still residing in the parent class + * * @author 梦境迷离 * @since 2020/12/09 */ @@ -19,20 +22,26 @@ public class KotlinGraphQLCodegen extends GraphQLCodegen { private static final MapperFactory MAPPER_FACTORY = new KotlinMapperFactoryImpl(); - public KotlinGraphQLCodegen(List schemas, File outputDir, MappingConfig mappingConfig, GeneratedInformation generatedInformation) { + public KotlinGraphQLCodegen(List schemas, File outputDir, MappingConfig mappingConfig, + GeneratedInformation generatedInformation) { super(schemas, outputDir, mappingConfig, generatedInformation, MAPPER_FACTORY); } - public KotlinGraphQLCodegen(String introspectionResult, File outputDir, MappingConfig mappingConfig, GeneratedInformation generatedInformation) { + public KotlinGraphQLCodegen(String introspectionResult, File outputDir, MappingConfig mappingConfig, + GeneratedInformation generatedInformation) { super(introspectionResult, outputDir, mappingConfig, generatedInformation, MAPPER_FACTORY); } - public KotlinGraphQLCodegen(List schemas, String introspectionResult, File outputDir, MappingConfig mappingConfig, MappingConfigSupplier externalMappingConfigSupplier) { + public KotlinGraphQLCodegen(List schemas, String introspectionResult, File outputDir, + MappingConfig mappingConfig, MappingConfigSupplier externalMappingConfigSupplier) { super(schemas, introspectionResult, outputDir, mappingConfig, externalMappingConfigSupplier, MAPPER_FACTORY); } - public KotlinGraphQLCodegen(List schemas, String introspectionResult, File outputDir, MappingConfig mappingConfig, MappingConfigSupplier externalMappingConfigSupplier, GeneratedInformation generatedInformation) { - super(schemas, introspectionResult, outputDir, mappingConfig, externalMappingConfigSupplier, generatedInformation, MAPPER_FACTORY); + public KotlinGraphQLCodegen(List schemas, String introspectionResult, File outputDir, + MappingConfig mappingConfig, MappingConfigSupplier externalMappingConfigSupplier, + GeneratedInformation generatedInformation) { + super(schemas, introspectionResult, outputDir, mappingConfig, externalMappingConfigSupplier, + generatedInformation, MAPPER_FACTORY); } @Override diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/kotlin/KotlinGraphQLTypeMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/kotlin/KotlinGraphQLTypeMapper.java index fb06ced09..524c1694a 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/kotlin/KotlinGraphQLTypeMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/kotlin/KotlinGraphQLTypeMapper.java @@ -14,6 +14,8 @@ import static java.util.Arrays.asList; /** + * Mapper class for converting GraphQL types to Kotlin types + * * @author 梦境迷离 * @since 2020/12/09 */ @@ -22,7 +24,8 @@ public class KotlinGraphQLTypeMapper implements GraphQLTypeMapper { private static final String KOTLIN_UTIL_LIST = "List"; private static final String KOTLIN_UTIL_NULLABLE = "?"; // Char Boolean are not primitive type, but non null equivalent jvm primitive types. - private static final Set KOTLIN_PRIMITIVE_TYPES = new HashSet<>(asList("Byte", "Short", "Int", "Long", "Float", "Double", "Char", "Boolean")); + private static final Set KOTLIN_PRIMITIVE_TYPES = new HashSet<>( + asList("Byte", "Short", "Int", "Long", "Float", "Double", "Char", "Boolean")); private final ValueMapper valueMapper; @@ -34,6 +37,32 @@ public static boolean isKotlinPrimitive(String scalaType) { return KOTLIN_PRIMITIVE_TYPES.contains(scalaType); } + /** + * This method is used in kotlin template, do not remove it. + * + * @param kotlinType type get from Type template + * @return default value + */ + public static String defaultValueKotlinPrimitive(String kotlinType) { + switch (kotlinType) { + case "Long": + return "0L"; + case "Float": + return "0F"; + case "Double": + return "0D"; + case "Char": + return "0.toChar()"; + case "Boolean": + return "false"; + case "Int": + case "Byte": + case "Short": + default: + return "0"; + } + } + @Override public String wrapIntoList(MappingContext mappingContext, String type, boolean mandatory) { //null2Query: [Int], mandatory=false @@ -93,7 +122,8 @@ public String getTypeConsideringPrimitive(MappingContext mappingContext, String computedTypeName) { String graphqlTypeName = namedDefinition.getGraphqlTypeName(); if (namedDefinition.isMandatory() && namedDefinition.isPrimitiveCanBeUsed()) { - String possiblyPrimitiveType = mappingContext.getCustomTypesMapping().get(GraphQLTypeMapper.getMandatoryType(graphqlTypeName)); + String possiblyPrimitiveType = mappingContext.getCustomTypesMapping() + .get(GraphQLTypeMapper.getMandatoryType(graphqlTypeName)); if (isPrimitive(possiblyPrimitiveType)) { return possiblyPrimitiveType; } @@ -103,18 +133,24 @@ public String getTypeConsideringPrimitive(MappingContext mappingContext, if (!computedTypeName.endsWith(KOTLIN_UTIL_NULLABLE) && !computedTypeName.startsWith(KOTLIN_UTIL_LIST)) { return computedTypeName + KOTLIN_UTIL_NULLABLE; } - // If it is not processed by 'wrapSuperTypeIntoList' and 'wrapIntoList', the nullable type may be missing here + // If it is not processed by 'wrapSuperTypeIntoList' and 'wrapIntoList', the nullable type may be missing + // here // Such as return a query type: ```codesOfConduct: [CodeOfConduct]``` if (computedTypeName.startsWith(KOTLIN_UTIL_LIST) && !graphqlTypeName.endsWith(KOTLIN_UTIL_NULLABLE)) { - String modelClassNameWithPrefixAndSuffix = DataModelMapper.getModelClassNameWithPrefixAndSuffix(mappingContext, graphqlTypeName); + String modelClassNameWithPrefixAndSuffix = DataModelMapper + .getModelClassNameWithPrefixAndSuffix(mappingContext, graphqlTypeName); if (computedTypeName.contains(modelClassNameWithPrefixAndSuffix + KOTLIN_UTIL_NULLABLE) || computedTypeName.contains(graphqlTypeName + KOTLIN_UTIL_NULLABLE)) { return computedTypeName; } - if (!computedTypeName.contains(modelClassNameWithPrefixAndSuffix + KOTLIN_UTIL_NULLABLE) && computedTypeName.contains(modelClassNameWithPrefixAndSuffix)) { - return computedTypeName.replace(modelClassNameWithPrefixAndSuffix, modelClassNameWithPrefixAndSuffix + KOTLIN_UTIL_NULLABLE); + if (!computedTypeName + .contains(modelClassNameWithPrefixAndSuffix + KOTLIN_UTIL_NULLABLE) && computedTypeName + .contains(modelClassNameWithPrefixAndSuffix)) { + return computedTypeName.replace(modelClassNameWithPrefixAndSuffix, + modelClassNameWithPrefixAndSuffix + KOTLIN_UTIL_NULLABLE); } - if (!computedTypeName.contains(graphqlTypeName + KOTLIN_UTIL_NULLABLE) && computedTypeName.contains(graphqlTypeName)) { + if (!computedTypeName.contains(graphqlTypeName + KOTLIN_UTIL_NULLABLE) && computedTypeName + .contains(graphqlTypeName)) { return computedTypeName.replace(graphqlTypeName, graphqlTypeName + KOTLIN_UTIL_NULLABLE); } } @@ -128,36 +164,13 @@ public ValueMapper getValueMapper() { return valueMapper; } - /** - * Thi method was used in kotlin template, do not remove it. - * - * @param kotlinType type get from Type template - * @return default value - */ - public static String defaultValueKotlinPrimitive(String kotlinType) { - switch (kotlinType) { - case "Long": - return "0L"; - case "Float": - return "0F"; - case "Double": - return "0D"; - case "Char": - return "0.toChar()"; - case "Boolean": - return "false"; - case "Int": - case "Byte": - case "Short": - default: - return "0"; - } - } - @Override - public String getResponseReturnType(MappingContext mappingContext, NamedDefinition namedDefinition, String computedTypeName) { + public String getResponseReturnType(MappingContext mappingContext, NamedDefinition namedDefinition, + String computedTypeName) { // Delegate to getTypeConsideringPrimitive. - // For kotlin such as XXXXXXResponse do not implement the mandatory function of graphql correctly when returnType is not List. Should fix it when generate response class. + // For kotlin such as XXXXXXResponse do not implement the mandatory function of graphql + // correctly when returnType is not List. + // Should fix it when generate response class. return getTypeConsideringPrimitive(mappingContext, namedDefinition, computedTypeName); } } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/kotlin/KotlinMapperFactoryImpl.java b/src/main/java/com/kobylynskyi/graphql/codegen/kotlin/KotlinMapperFactoryImpl.java index dbef47e23..040e7ae22 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/kotlin/KotlinMapperFactoryImpl.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/kotlin/KotlinMapperFactoryImpl.java @@ -7,6 +7,8 @@ import com.kobylynskyi.graphql.codegen.mapper.ValueMapper; /** + * A factory of various mappers for Kotlin language + * * @author 梦境迷离 * @since 2020/12/09 */ diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/kotlin/KotlinValueFormatter.java b/src/main/java/com/kobylynskyi/graphql/codegen/kotlin/KotlinValueFormatter.java index d3156b5d8..41a80d011 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/kotlin/KotlinValueFormatter.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/kotlin/KotlinValueFormatter.java @@ -5,6 +5,8 @@ import java.util.StringJoiner; /** + * Class contains various formatting logic that is specific only for Kotlin language + * * @author 梦境迷离 * @since 2020/12/09 */ diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/DataModelMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/DataModelMapper.java index a4d83f2cf..a75cf30ba 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/DataModelMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/DataModelMapper.java @@ -22,8 +22,23 @@ import java.util.function.Function; import java.util.stream.Collectors; +/** + * Generic mapper for all languages + */ public interface DataModelMapper { + /** + * Generates a model class name including prefix and suffix (if any) + * + * @param mappingContext Global mapping context, record enum type + * @param extendedDefinition GraphQL extended definition + * @return Class name of GraphQL model node + */ + default String getModelClassNameWithPrefixAndSuffix(MappingContext mappingContext, + ExtendedDefinition extendedDefinition) { + return getModelClassNameWithPrefixAndSuffix(mappingContext, extendedDefinition.getName()); + } + /** * Generates a model class name including prefix and suffix (if any) * @@ -64,7 +79,8 @@ static String getTypeResolverClassNameWithPrefixAndSuffix(MappingContext mapping /** * Generates an api class name including prefix and suffix (if any) - * Examples: CreateEventMutationResolver, EventsQueryResolver, EventsByIdsQueryResolver (rootTypeName is "Query" or the likes) + * Examples: CreateEventMutationResolver, EventsQueryResolver, EventsByIdsQueryResolver (rootTypeName is "Query" + * or the likes) * * @param mappingContext Global mapping context * @param fieldDefinition GraphQL field definition @@ -161,7 +177,7 @@ static String getPrefixFromSourceLocation(SourceLocation sourceLocation, // remove prefix fileName = fileName.replaceFirst("[.][^.]+$", ""); // capitalize - fileName = Utils.capitalizeString(fileName); + fileName = Utils.camelCaseString(fileName); // leave only alphanumeric fileName = fileName.replaceAll("[^A-Za-z0-9]", ""); return fileName; @@ -263,19 +279,18 @@ static String getClassNameSuffixWithInputValues(ExtendedFieldDefinition fieldDef * @param document GraphQL document * @return all interfaces that given type implements. */ - static List getInterfacesOfType(ExtendedImplementingTypeDefinition definition, - ExtendedDocument document) { + static List getInterfacesOfType( + ExtendedImplementingTypeDefinition definition, + ExtendedDocument document) { if (definition.getImplements().isEmpty()) { return Collections.emptyList(); } - Set typeImplements = definition.getImplements() - .stream() + Set typeImplements = definition.getImplements().stream() .filter(type -> TypeName.class.isAssignableFrom(type.getClass())) .map(TypeName.class::cast) .map(TypeName::getName) .collect(Collectors.toSet()); - return document.getInterfaceDefinitions() - .stream() + return document.getInterfaceDefinitions().stream() .filter(def -> typeImplements.contains(def.getName())) .collect(Collectors.toList()); } @@ -309,16 +324,4 @@ static Function getParentFileNameFunction() { */ String capitalizeMethodNameIfRestricted(MappingContext mappingContext, String methodName); - /** - * Generates a model class name including prefix and suffix (if any) - * - * @param mappingContext Global mapping context, record enum type - * @param extendedDefinition GraphQL extended definition - * @return Class name of GraphQL model node - */ - default String getModelClassNameWithPrefixAndSuffix(MappingContext mappingContext, - ExtendedDefinition extendedDefinition) { - return getModelClassNameWithPrefixAndSuffix(mappingContext, extendedDefinition.getName()); - } - } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/DataModelMapperFactory.java b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/DataModelMapperFactory.java index d8284d4a8..52da8119e 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/DataModelMapperFactory.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/DataModelMapperFactory.java @@ -2,68 +2,82 @@ import com.kobylynskyi.graphql.codegen.MapperFactory; +/** + * Factory of data model mappers + */ public class DataModelMapperFactory { - private final EnumDefinitionToDataModelMapper enumDefinitionToDataModelMapper; - private final FieldDefinitionsToResolverDataModelMapper fieldDefinitionsToResolverDataModelMapper; - private final InputDefinitionToDataModelMapper inputDefinitionToDataModelMapper; - private final InterfaceDefinitionToDataModelMapper interfaceDefinitionToDataModelMapper; - private final RequestResponseDefinitionToDataModelMapper requestResponseDefinitionToDataModelMapper; - private final TypeDefinitionToDataModelMapper typeDefinitionToDataModelMapper; - private final UnionDefinitionToDataModelMapper unionDefinitionToDataModelMapper; + private final EnumDefinitionToDataModelMapper enumDefToDataModelMapper; + private final FieldDefinitionsToResolverDataModelMapper fieldDefsToResolverDataModelMapper; + private final InputDefinitionToDataModelMapper inputDefToDataModelMapper; + private final InterfaceDefinitionToDataModelMapper interfaceDefToDataModelMapper; + private final RequestResponseDefinitionToDataModelMapper requestResponseDefToDataModelMapper; + private final TypeDefinitionToDataModelMapper typeDefToDataModelMapper; + private final UnionDefinitionToDataModelMapper unionDefToDataModelMapper; private final DataModelMapper dataModelMapper; - private final FieldDefinitionToParameterMapper fieldDefinitionToParameterMapper; + private final FieldDefinitionToParameterMapper fieldDefToParamMapper; + /** + * Constructor for creating a new DataModelMapperFactory based on a MapperFactory + * + * @param generatedLanguageMapperFactory Mapper factory of a generated language + */ public DataModelMapperFactory(MapperFactory generatedLanguageMapperFactory) { ValueFormatter valueFormatter = generatedLanguageMapperFactory.createValueFormatter(); dataModelMapper = generatedLanguageMapperFactory.createDataModelMapper(); ValueMapper valueMapper = new ValueMapper(valueFormatter, dataModelMapper); - GraphQLTypeMapper graphQLTypeMapper = generatedLanguageMapperFactory.createGraphQLTypeMapper(valueMapper); - fieldDefinitionToParameterMapper = new FieldDefinitionToParameterMapper(graphQLTypeMapper, dataModelMapper); - InputValueDefinitionToParameterMapper inputValueDefinitionToParameterMapper = new InputValueDefinitionToParameterMapper(valueMapper, graphQLTypeMapper, dataModelMapper); - enumDefinitionToDataModelMapper = new EnumDefinitionToDataModelMapper(graphQLTypeMapper, dataModelMapper); - unionDefinitionToDataModelMapper = new UnionDefinitionToDataModelMapper(graphQLTypeMapper, dataModelMapper); - typeDefinitionToDataModelMapper = new TypeDefinitionToDataModelMapper(graphQLTypeMapper, dataModelMapper, fieldDefinitionToParameterMapper); - interfaceDefinitionToDataModelMapper = new InterfaceDefinitionToDataModelMapper(graphQLTypeMapper, dataModelMapper, fieldDefinitionToParameterMapper); - inputDefinitionToDataModelMapper = new InputDefinitionToDataModelMapper(graphQLTypeMapper, dataModelMapper, inputValueDefinitionToParameterMapper); - fieldDefinitionsToResolverDataModelMapper = new FieldDefinitionsToResolverDataModelMapper(graphQLTypeMapper, dataModelMapper, inputValueDefinitionToParameterMapper); - requestResponseDefinitionToDataModelMapper = new RequestResponseDefinitionToDataModelMapper(graphQLTypeMapper, dataModelMapper, fieldDefinitionToParameterMapper, inputValueDefinitionToParameterMapper); + GraphQLTypeMapper graphQlTypeMapper = generatedLanguageMapperFactory.createGraphQLTypeMapper(valueMapper); + fieldDefToParamMapper = new FieldDefinitionToParameterMapper(graphQlTypeMapper, dataModelMapper); + enumDefToDataModelMapper = new EnumDefinitionToDataModelMapper(graphQlTypeMapper, dataModelMapper); + unionDefToDataModelMapper = new UnionDefinitionToDataModelMapper(graphQlTypeMapper, dataModelMapper); + typeDefToDataModelMapper = new TypeDefinitionToDataModelMapper(graphQlTypeMapper, dataModelMapper, + fieldDefToParamMapper); + interfaceDefToDataModelMapper = new InterfaceDefinitionToDataModelMapper(graphQlTypeMapper, dataModelMapper, + fieldDefToParamMapper); + InputValueDefinitionToParameterMapper inputValueDefToParamMapper = new InputValueDefinitionToParameterMapper( + valueMapper, graphQlTypeMapper, dataModelMapper); + inputDefToDataModelMapper = new InputDefinitionToDataModelMapper(graphQlTypeMapper, dataModelMapper, + inputValueDefToParamMapper); + fieldDefsToResolverDataModelMapper = new FieldDefinitionsToResolverDataModelMapper( + graphQlTypeMapper, dataModelMapper, inputValueDefToParamMapper); + requestResponseDefToDataModelMapper = new RequestResponseDefinitionToDataModelMapper( + graphQlTypeMapper, dataModelMapper, fieldDefToParamMapper, inputValueDefToParamMapper); } public EnumDefinitionToDataModelMapper getEnumDefinitionMapper() { - return enumDefinitionToDataModelMapper; + return enumDefToDataModelMapper; } public FieldDefinitionsToResolverDataModelMapper getFieldDefinitionsToResolverMapper() { - return fieldDefinitionsToResolverDataModelMapper; + return fieldDefsToResolverDataModelMapper; } public InputDefinitionToDataModelMapper getInputDefinitionMapper() { - return inputDefinitionToDataModelMapper; + return inputDefToDataModelMapper; } public InterfaceDefinitionToDataModelMapper getInterfaceDefinitionMapper() { - return interfaceDefinitionToDataModelMapper; + return interfaceDefToDataModelMapper; } public UnionDefinitionToDataModelMapper getUnionDefinitionMapper() { - return unionDefinitionToDataModelMapper; + return unionDefToDataModelMapper; } public RequestResponseDefinitionToDataModelMapper getRequestResponseDefinitionMapper() { - return requestResponseDefinitionToDataModelMapper; + return requestResponseDefToDataModelMapper; } public TypeDefinitionToDataModelMapper getTypeDefinitionMapper() { - return typeDefinitionToDataModelMapper; + return typeDefToDataModelMapper; } public DataModelMapper getDataModelMapper() { return dataModelMapper; } - public FieldDefinitionToParameterMapper getFieldDefinitionToParameterMapper() { - return fieldDefinitionToParameterMapper; + public FieldDefinitionToParameterMapper getFieldDefToParamMapper() { + return fieldDefToParamMapper; } } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/EnumDefinitionToDataModelMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/EnumDefinitionToDataModelMapper.java index 300fa5356..1d841ebea 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/EnumDefinitionToDataModelMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/EnumDefinitionToDataModelMapper.java @@ -17,7 +17,15 @@ import java.util.Set; import java.util.stream.Collectors; -import static com.kobylynskyi.graphql.codegen.model.DataModelFields.*; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.ANNOTATIONS; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.CLASS_NAME; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.FIELDS; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.GENERATED_ANNOTATION; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.GENERATED_INFO; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.IMPLEMENTS; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.JAVA_DOC; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.PACKAGE; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.SERIALIZATION_LIBRARY; /** * Map enum definition to a Freemarker data model @@ -26,29 +34,25 @@ */ public class EnumDefinitionToDataModelMapper { - private final GraphQLTypeMapper graphQLTypeMapper; + private final GraphQLTypeMapper graphQlTypeMapper; private final DataModelMapper dataModelMapper; - public EnumDefinitionToDataModelMapper(GraphQLTypeMapper graphQLTypeMapper, + public EnumDefinitionToDataModelMapper(GraphQLTypeMapper graphQlTypeMapper, DataModelMapper dataModelMapper) { - this.graphQLTypeMapper = graphQLTypeMapper; + this.graphQlTypeMapper = graphQlTypeMapper; this.dataModelMapper = dataModelMapper; } private static Set getUnionInterfaces(MappingContext mappingContext, ExtendedEnumTypeDefinition definition) { - return mappingContext.getDocument().getUnionDefinitions() - .stream() + return mappingContext.getDocument().getUnionDefinitions().stream() .filter(union -> union.isDefinitionPartOfUnion(definition)) .map(ExtendedUnionTypeDefinition::getName) - .map(unionName -> DataModelMapper.getModelClassNameWithPrefixAndSuffix(mappingContext, unionName)) + .map(unionName -> DataModelMapper + .getModelClassNameWithPrefixAndSuffix(mappingContext, unionName)) .collect(Collectors.toSet()); } - public DeprecatedDefinition getDeprecated(MappingContext mappingContext, DirectivesContainer directivesContainer) { - return graphQLTypeMapper.getDeprecated(mappingContext, directivesContainer); - } - private static List getJavaDoc(graphql.language.EnumValueDefinition def) { if (def.getDescription() != null) { return Collections.singletonList(def.getDescription().getContent()); @@ -61,6 +65,11 @@ private static List getJavaDoc(graphql.language.EnumValueDefinition def) .map(String::trim).collect(Collectors.toList()); } + public DeprecatedDefinition getDeprecated(MappingContext mappingContext, + DirectivesContainer directivesContainer) { + return graphQlTypeMapper.getDeprecated(mappingContext, directivesContainer); + } + /** * Map field definition to a Freemarker data model * @@ -74,7 +83,7 @@ public Map map(MappingContext mappingContext, ExtendedEnumTypeDe dataModel.put(PACKAGE, DataModelMapper.getModelPackageName(mappingContext)); dataModel.put(CLASS_NAME, dataModelMapper.getModelClassNameWithPrefixAndSuffix(mappingContext, definition)); dataModel.put(IMPLEMENTS, getUnionInterfaces(mappingContext, definition)); - dataModel.put(ANNOTATIONS, graphQLTypeMapper.getAnnotations(mappingContext, definition)); + dataModel.put(ANNOTATIONS, graphQlTypeMapper.getAnnotations(mappingContext, definition)); dataModel.put(JAVA_DOC, definition.getJavaDoc()); dataModel.put(FIELDS, map(mappingContext, definition.getValueDefinitions())); dataModel.put(GENERATED_ANNOTATION, mappingContext.getAddGeneratedAnnotation()); @@ -90,7 +99,8 @@ public Map map(MappingContext mappingContext, ExtendedEnumTypeDe * @param enumValueDefinitions list of GraphQL EnumValueDefinition types * @return list of strings */ - private List map(MappingContext mappingContext, List enumValueDefinitions) { + private List map(MappingContext mappingContext, + List enumValueDefinitions) { return enumValueDefinitions.stream() .map(f -> new EnumValueDefinition( dataModelMapper.capitalizeIfRestricted(mappingContext, f.getName()), diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/FieldDefinitionToParameterMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/FieldDefinitionToParameterMapper.java index d1503f07d..7f3cfd1d9 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/FieldDefinitionToParameterMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/FieldDefinitionToParameterMapper.java @@ -41,27 +41,35 @@ public static boolean generateResolversForField(MappingContext mappingContext, ExtendedDefinition parentDefinition) { String parentTypeName = parentDefinition.getName(); boolean noResolverForWholeType = mappingContext.getFieldsWithoutResolvers().contains(parentTypeName); - boolean noResolverForSpecificField = mappingContext.getFieldsWithoutResolvers().contains(parentTypeName + "." + fieldDef.getName()); + boolean noResolverForSpecificField = mappingContext.getFieldsWithoutResolvers() + .contains(parentTypeName + "." + fieldDef.getName()); if (noResolverForWholeType || noResolverForSpecificField) { return false; } for (String fieldWithoutResolver : mappingContext.getFieldsWithoutResolvers()) { - boolean noResolverForWholeTypeViaDirective = parentDefinition.getDirectiveNames().stream().anyMatch(fd -> fieldWithoutResolver.equals("@" + fd)); - boolean noResolverForSpecificFieldViaDirective = fieldDef.getDirectives().stream().anyMatch(fd -> fieldWithoutResolver.equals("@" + fd.getName())); + boolean noResolverForWholeTypeViaDirective = parentDefinition.getDirectiveNames().stream().anyMatch( + fd -> fieldWithoutResolver.equals("@" + fd)); + boolean noResolverForSpecificFieldViaDirective = fieldDef.getDirectives().stream().anyMatch( + fd -> fieldWithoutResolver.equals("@" + fd.getName())); if (noResolverForWholeTypeViaDirective || noResolverForSpecificFieldViaDirective) { return false; } } - boolean resolverForParamField = mappingContext.getGenerateParameterizedFieldsResolvers() && !Utils.isEmpty(fieldDef.getInputValueDefinitions()); - boolean resolverForExtendedType = mappingContext.getGenerateExtensionFieldsResolvers() && fieldDef.isFromExtension(); + boolean resolverForParamField = mappingContext.getGenerateParameterizedFieldsResolvers() && !Utils + .isEmpty(fieldDef.getInputValueDefinitions()); + boolean resolverForExtendedType = mappingContext.getGenerateExtensionFieldsResolvers() && fieldDef + .isFromExtension(); boolean resolverForWholeType = mappingContext.getFieldsWithResolvers().contains(parentTypeName); - boolean resolverForTypeField = mappingContext.getFieldsWithResolvers().contains(parentTypeName + "." + fieldDef.getName()); + boolean resolverForTypeField = mappingContext.getFieldsWithResolvers() + .contains(parentTypeName + "." + fieldDef.getName()); if (resolverForParamField || resolverForExtendedType || resolverForWholeType || resolverForTypeField) { return true; } for (String fieldWithResolver : mappingContext.getFieldsWithResolvers()) { - boolean resolverForWholeTypeViaDirective = parentDefinition.getDirectiveNames().stream().anyMatch(fd -> fieldWithResolver.equals("@" + fd)); - boolean resolverForSpecificFieldViaDirective = fieldDef.getDirectives().stream().anyMatch(fd -> fieldWithResolver.equals("@" + fd.getName())); + boolean resolverForWholeTypeViaDirective = parentDefinition.getDirectiveNames().stream().anyMatch( + fd -> fieldWithResolver.equals("@" + fd)); + boolean resolverForSpecificFieldViaDirective = fieldDef.getDirectives().stream().anyMatch( + fd -> fieldWithResolver.equals("@" + fd.getName())); if (resolverForWholeTypeViaDirective || resolverForSpecificFieldViaDirective) { return true; } @@ -81,7 +89,8 @@ public List mapFields(MappingContext mappingContext, List fieldDefinitions, ExtendedDefinition parentDefinition) { return fieldDefinitions.stream() - .filter(fieldDef -> !generateResolversForField(mappingContext, fieldDef, parentDefinition)) + .filter( + fieldDef -> !generateResolversForField(mappingContext, fieldDef, parentDefinition)) .map(fieldDef -> mapField(mappingContext, fieldDef, parentDefinition.getName())) .collect(toList()); } @@ -112,13 +121,16 @@ public List mapProjectionFields(MappingContext ma */ private ParameterDefinition mapField(MappingContext mappingContext, ExtendedFieldDefinition fieldDef, String parentTypeName) { - NamedDefinition namedDefinition = graphQLTypeMapper.getLanguageType(mappingContext, fieldDef.getType(), fieldDef.getName(), parentTypeName); + NamedDefinition namedDefinition = graphQLTypeMapper + .getLanguageType(mappingContext, fieldDef.getType(), fieldDef.getName(), parentTypeName); ParameterDefinition parameter = new ParameterDefinition(); parameter.setName(dataModelMapper.capitalizeIfRestricted(mappingContext, fieldDef.getName())); parameter.setOriginalName(fieldDef.getName()); - parameter.setType(graphQLTypeMapper.getTypeConsideringPrimitive(mappingContext, namedDefinition, namedDefinition.getJavaName())); - parameter.setAnnotations(graphQLTypeMapper.getAnnotations(mappingContext, fieldDef.getType(), fieldDef, parentTypeName, false)); + parameter.setType(graphQLTypeMapper.getTypeConsideringPrimitive(mappingContext, namedDefinition, + namedDefinition.getJavaName())); + parameter.setAnnotations( + graphQLTypeMapper.getAnnotations(mappingContext, fieldDef.getType(), fieldDef, parentTypeName, false)); parameter.setJavaDoc(fieldDef.getJavaDoc()); parameter.setDeprecated(fieldDef.getDeprecated(mappingContext)); parameter.setMandatory(namedDefinition.isMandatory()); diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/FieldDefinitionsToResolverDataModelMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/FieldDefinitionsToResolverDataModelMapper.java index e41ad462c..3f928e787 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/FieldDefinitionsToResolverDataModelMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/FieldDefinitionsToResolverDataModelMapper.java @@ -46,12 +46,19 @@ public class FieldDefinitionsToResolverDataModelMapper { public FieldDefinitionsToResolverDataModelMapper(GraphQLTypeMapper graphQLTypeMapper, DataModelMapper dataModelMapper, - InputValueDefinitionToParameterMapper inputValueDefinitionToParameterMapper) { + InputValueDefinitionToParameterMapper inputValueDefToParamMapper) { this.graphQLTypeMapper = graphQLTypeMapper; this.dataModelMapper = dataModelMapper; - this.inputValueDefinitionToParameterMapper = inputValueDefinitionToParameterMapper; + this.inputValueDefinitionToParameterMapper = inputValueDefToParamMapper; } + /** + * Get parent Interface name + * + * @param mappingContext Global mapping context + * @param typeName GraphQL node name + * @return name of the parent interface + */ public static String getParentInterface(MappingContext mappingContext, String typeName) { // 1. check if provided type name is GraphQL root type try { @@ -62,8 +69,11 @@ public static String getParentInterface(MappingContext mappingContext, String ty return mappingContext.getMutationResolverParentInterface(); case SUBSCRIPTION: return mappingContext.getSubscriptionResolverParentInterface(); + default: + // continue } } catch (Exception ignored) { + // meaning the type is not one of the GraphQL root operations } // 2. if provided type name is GraphQL root type then assume that it is GraphQL type @@ -106,7 +116,8 @@ public Map mapRootTypeField(MappingContext mappingContext, ExtendedFieldDefinition fieldDefinition, String rootTypeName, List fieldNames) { - String className = DataModelMapper.getApiClassNameWithPrefixAndSuffix(mappingContext, fieldDefinition, rootTypeName, fieldNames); + String className = DataModelMapper + .getApiClassNameWithPrefixAndSuffix(mappingContext, fieldDefinition, rootTypeName, fieldNames); List fieldDefs = Collections.singletonList(fieldDefinition); return mapToResolverModel(mappingContext, rootTypeName, className, fieldDefs, fieldDefinition.getJavaDoc(), getParentInterface(mappingContext, rootTypeName)); @@ -169,7 +180,8 @@ private List mapToOperations(MappingContext mappingContext, } /** - * Builds a Freemarker-understandable structure representing an operation to resolve a field for a given parent type. + * Builds a Freemarker-understandable structure representing an operation to resolve a field for a given parent + * type. * * @param mappingContext Global mapping context * @param fieldDef The GraphQL definition of the field that the method should resolve @@ -179,9 +191,11 @@ private List mapToOperations(MappingContext mappingContext, private OperationDefinition map(MappingContext mappingContext, ExtendedFieldDefinition fieldDef, String parentTypeName) { String name = dataModelMapper.capitalizeIfRestricted(mappingContext, fieldDef.getName()); - NamedDefinition javaType = graphQLTypeMapper.getLanguageType(mappingContext, fieldDef.getType(), fieldDef.getName(), parentTypeName); + NamedDefinition javaType = graphQLTypeMapper + .getLanguageType(mappingContext, fieldDef.getType(), fieldDef.getName(), parentTypeName); String returnType = getReturnType(mappingContext, fieldDef, javaType, parentTypeName); - List annotations = graphQLTypeMapper.getAnnotations(mappingContext, fieldDef.getType(), fieldDef, parentTypeName, false); + List annotations = graphQLTypeMapper + .getAnnotations(mappingContext, fieldDef.getType(), fieldDef, parentTypeName, false); List parameters = getOperationParameters(mappingContext, fieldDef, parentTypeName); OperationDefinition operation = new OperationDefinition(); @@ -203,8 +217,10 @@ private List getOperationParameters(MappingContext mappingC // 1. First parameter is the parent object for which we are resolving fields (unless it's the root Query) if (!Utils.isGraphqlOperation(parentTypeName)) { - String parentObjectParamType = graphQLTypeMapper.getLanguageType(mappingContext, new TypeName(parentTypeName)); - String parentObjectParamName = dataModelMapper.capitalizeIfRestricted(mappingContext, Utils.uncapitalize(parentObjectParamType)); + String parentObjectParamType = graphQLTypeMapper + .getLanguageType(mappingContext, new TypeName(parentTypeName)); + String parentObjectParamName = dataModelMapper + .capitalizeIfRestricted(mappingContext, Utils.unCapitalize(parentObjectParamType)); ParameterDefinition parameterDefinition = new ParameterDefinition(); parameterDefinition.setType(parentObjectParamType); parameterDefinition.setName(parentObjectParamName); @@ -214,7 +230,8 @@ private List getOperationParameters(MappingContext mappingC } // 2. Next parameters are input values - parameters.addAll(inputValueDefinitionToParameterMapper.map(mappingContext, resolvedField.getInputValueDefinitions(), resolvedField.getName())); + parameters.addAll(inputValueDefinitionToParameterMapper + .map(mappingContext, resolvedField.getInputValueDefinitions(), resolvedField.getName())); // 3. Last parameter (optional) is the DataFetchingEnvironment if (Boolean.TRUE.equals(mappingContext.getGenerateDataFetchingEnvironmentArgumentInApis())) { @@ -234,8 +251,11 @@ private String getReturnType(MappingContext mappingContext, ExtendedFieldDefinit if (argument != null && argument.getValue() instanceof StringValue) { String graphqlTypeName = ((StringValue) argument.getValue()).getValue(); String javaTypeName = graphQLTypeMapper.getLanguageType(mappingContext, - new TypeName(graphqlTypeName), graphqlTypeName, parentTypeName, false, false).getJavaName(); - return graphQLTypeMapper.getGenericsString(mappingContext, relayConfig.getConnectionType(), javaTypeName); + new TypeName(graphqlTypeName), + graphqlTypeName, parentTypeName, false, + false).getJavaName(); + return graphQLTypeMapper + .getGenericsString(mappingContext, relayConfig.getConnectionType(), javaTypeName); } } } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/GraphQLTypeMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/GraphQLTypeMapper.java index e7a1f8fd1..c172efe60 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/GraphQLTypeMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/GraphQLTypeMapper.java @@ -84,23 +84,26 @@ static List getDirectives(NamedNode def) { /** * Wraps type into apiReturnType or subscriptionReturnType (defined in the mapping configuration). - * Examples: - *

- * - Given GraphQL schema: {@code type Query { events: [Event!]! }} - * - Given config: {@code useOptionalForNullableReturnTypes = true} - * - Return: {@code java.util.Optional} - *

- * - Given GraphQL schema: {@code type Subscription { eventsCreated: [Event!]! }} - * - Given subscriptionReturnType in config: {@code org.reactivestreams.Publisher} - * - Return: {@code org.reactivestreams.Publisher} - *

- * - Given GraphQL schema: {@code type Mutation { createEvent(inp: Inp): Event }} - * - Given apiReturnType in config: {@code reactor.core.publisher.Mono} - * - Return: {@code reactor.core.publisher.Mono} - *

- * - Given GraphQL schema: {@code type Query { events: [Event!]! }} - * - Given apiReturnListType in config: {@code reactor.core.publisher.Flux} - * - Return: {@code reactor.core.publisher.Flux} + * + *

Example 1: + * * Given GraphQL schema: {@code type Query { events: [Event!]! }} + * * Given config: {@code useOptionalForNullableReturnTypes = true} + * * Return: {@code java.util.Optional} + * + *

Example 2: + * * Given GraphQL schema: {@code type Subscription { eventsCreated: [Event!]! }} + * * Given subscriptionReturnType in config: {@code org.reactivestreams.Publisher} + * * Return: {@code org.reactivestreams.Publisher} + * + *

Example 3: + * * Given GraphQL schema: {@code type Mutation { createEvent(inp: Inp): Event }} + * * Given apiReturnType in config: {@code reactor.core.publisher.Mono} + * * Return: {@code reactor.core.publisher.Mono} + * + *

Example 4: + * * Given GraphQL schema: {@code type Query { events: [Event!]! }} + * * Given apiReturnListType in config: {@code reactor.core.publisher.Flux} + * * Return: {@code reactor.core.publisher.Flux} * * @param mappingContext Global mapping context * @param namedDefinition Named definition @@ -119,6 +122,14 @@ String wrapApiReturnTypeIfRequired(MappingContext mappingContext, */ boolean isPrimitive(String possiblyPrimitiveType); + /** + * Whether to add model validation annotation to a type + * + * @param type GraphQL type name + * @return true if model validation annotation should be added to a type + */ + boolean addModelValidationAnnotationForType(String type); + /** * Wrap string into generics type * @@ -155,7 +166,8 @@ default String getLanguageType(MappingContext mappingContext, Type type) { * @param parentTypeName Name of the parent type * @return Corresponding language-specific type (java/scala/kotlin/etc) */ - default NamedDefinition getLanguageType(MappingContext mappingContext, Type graphqlType, String name, String parentTypeName) { + default NamedDefinition getLanguageType(MappingContext mappingContext, Type graphqlType, String name, + String parentTypeName) { return getLanguageType(mappingContext, graphqlType, name, parentTypeName, false, false); } @@ -174,17 +186,22 @@ default NamedDefinition getLanguageType(MappingContext mappingContext, Type g String name, String parentTypeName, boolean mandatory, boolean collection) { if (graphqlType instanceof TypeName) { - return getLanguageType(mappingContext, ((TypeName) graphqlType).getName(), name, parentTypeName, mandatory, collection); + return getLanguageType(mappingContext, ((TypeName) graphqlType).getName(), name, parentTypeName, mandatory, + collection); } else if (graphqlType instanceof ListType) { - NamedDefinition mappedCollectionType = getLanguageType(mappingContext, ((ListType) graphqlType).getType(), name, parentTypeName, false, true); + NamedDefinition mappedCollectionType = getLanguageType(mappingContext, ((ListType) graphqlType).getType(), + name, parentTypeName, false, true); if (mappedCollectionType.isInterface() && mappingContext.getInterfacesName().contains(parentTypeName)) { - mappedCollectionType.setJavaName(wrapSuperTypeIntoList(mappingContext, mappedCollectionType.getJavaName(), mandatory)); + mappedCollectionType.setJavaName( + wrapSuperTypeIntoList(mappingContext, mappedCollectionType.getJavaName(), mandatory)); } else { - mappedCollectionType.setJavaName(wrapIntoList(mappingContext, mappedCollectionType.getJavaName(), mandatory)); + mappedCollectionType.setJavaName( + wrapIntoList(mappingContext, mappedCollectionType.getJavaName(), mandatory)); } return mappedCollectionType; } else if (graphqlType instanceof NonNullType) { - return getLanguageType(mappingContext, ((NonNullType) graphqlType).getType(), name, parentTypeName, true, collection); + return getLanguageType(mappingContext, ((NonNullType) graphqlType).getType(), name, parentTypeName, true, + collection); } throw new IllegalArgumentException("Unknown type: " + graphqlType); } @@ -244,32 +261,48 @@ default List getAnnotations(MappingContext mappingContext, Type type, } else if (type instanceof NonNullType) { return getAnnotations(mappingContext, ((NonNullType) type).getType(), def, parentTypeName, true); } else if (type instanceof TypeName) { - return getAnnotations(mappingContext, ((TypeName) type).getName(), def.getName(), parentTypeName, getDirectives(def), mandatory); + return getAnnotations(mappingContext, ((TypeName) type).getName(), def.getName(), parentTypeName, + getDirectives(def), mandatory); } return Collections.emptyList(); } default List getAnnotations(MappingContext mappingContext, ExtendedDefinition extendedDefinition) { - return getAnnotations(mappingContext, extendedDefinition.getName(), extendedDefinition.getName(), null, Collections.emptyList(), false); + return getAnnotations(mappingContext, extendedDefinition.getName(), extendedDefinition.getName(), null, + Collections.emptyList(), false); } default List getAnnotations(MappingContext mappingContext, String name) { return getAnnotations(mappingContext, name, name, null, Collections.emptyList(), false); } + /** + * Get annotations for a given GraphQL type + * + * @param mappingContext Global mapping context + * @param graphQLTypeName GraphQL type + * @param name Name of the GraphQL type + * @param parentTypeName Name of the parent type + * @param directives List of GraphQL directive + * @param mandatory Type is mandatory + * @return list of Java annotations for a given GraphQL type + */ default List getAnnotations(MappingContext mappingContext, String graphQLTypeName, String name, String parentTypeName, List directives, boolean mandatory) { List annotations = new ArrayList<>(); if (mandatory) { - String possiblyPrimitiveType = mappingContext.getCustomTypesMapping().get(getMandatoryType(graphQLTypeName)); + String possiblyPrimitiveType = mappingContext.getCustomTypesMapping() + .get(getMandatoryType(graphQLTypeName)); String modelValidationAnnotation = mappingContext.getModelValidationAnnotation(); - if (Utils.isNotBlank(modelValidationAnnotation) && addModelValidationAnnotationForType(possiblyPrimitiveType)) { + if (Utils.isNotBlank(modelValidationAnnotation) && addModelValidationAnnotationForType( + possiblyPrimitiveType)) { annotations.add(modelValidationAnnotation); } } Map> customAnnotationsMapping = mappingContext.getCustomAnnotationsMapping(); - if (name != null && parentTypeName != null && customAnnotationsMapping.containsKey(parentTypeName + "." + name)) { + if (name != null && parentTypeName != null && customAnnotationsMapping + .containsKey(parentTypeName + "." + name)) { List annotationsToAdd = customAnnotationsMapping.get(parentTypeName + "." + name); if (!Utils.isEmpty(annotationsToAdd)) { annotations.addAll(annotationsToAdd); @@ -284,17 +317,24 @@ default List getAnnotations(MappingContext mappingContext, String graphQ Map> directiveAnnotationsMapping = mappingContext.getDirectiveAnnotationsMapping(); for (Directive directive : directives) { if (directiveAnnotationsMapping.containsKey(directive.getName())) { - annotations.addAll(getAnnotationForDirective(mappingContext, directiveAnnotationsMapping.get(directive.getName()), directive)); + annotations.addAll(getAnnotationsForDirective( + mappingContext, directiveAnnotationsMapping.get(directive.getName()), directive)); } } return annotations; } - boolean addModelValidationAnnotationForType(String possiblyPrimitiveType); - - default List getAnnotationForDirective(MappingContext mappingContext, - List directiveAnnotations, - Directive directive) { + /** + * Get a list of annotations for a given directive based on mapping config + * + * @param mappingContext Global mapping context + * @param directiveAnnotations List of directive annotations + * @param directive GraphQL Directive + * @return a list of annotations to be added for all types that have given directive + */ + default List getAnnotationsForDirective(MappingContext mappingContext, + List directiveAnnotations, + Directive directive) { List directiveAnnotationsMapped = new ArrayList<>(); for (String annotation : directiveAnnotations) { String directiveAnnotationMapped = annotation; @@ -317,7 +357,8 @@ default String getTypeConsideringPrimitive(MappingContext mappingContext, String computedTypeName) { String graphqlTypeName = namedDefinition.getGraphqlTypeName(); if (namedDefinition.isMandatory() && namedDefinition.isPrimitiveCanBeUsed()) { - String possiblyPrimitiveType = mappingContext.getCustomTypesMapping().get(getMandatoryType(graphqlTypeName)); + String possiblyPrimitiveType = mappingContext.getCustomTypesMapping() + .get(getMandatoryType(graphqlTypeName)); if (isPrimitive(possiblyPrimitiveType)) { return possiblyPrimitiveType; } @@ -331,12 +372,14 @@ default String getResponseReturnType(MappingContext mappingContext, return computedTypeName; } - default DeprecatedDefinition getDeprecated(MappingContext mappingContext, DirectivesContainer directivesContainer) { + default DeprecatedDefinition getDeprecated(MappingContext mappingContext, + DirectivesContainer directivesContainer) { return directivesContainer.getDirectives() .stream() .filter(d -> d.getName().equalsIgnoreCase(Deprecated.class.getSimpleName())) .findFirst() - .map(directive -> MultiLanguageDeprecated.getLanguageDeprecated(mappingContext.getGeneratedLanguage(), directive)) + .map(directive -> MultiLanguageDeprecated + .getLanguageDeprecated(mappingContext.getGeneratedLanguage(), directive)) .orElse(null); } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/InputDefinitionToDataModelMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/InputDefinitionToDataModelMapper.java index c7ad68671..ae11edaac 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/InputDefinitionToDataModelMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/InputDefinitionToDataModelMapper.java @@ -6,7 +6,21 @@ import java.util.HashMap; import java.util.Map; -import static com.kobylynskyi.graphql.codegen.model.DataModelFields.*; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.ANNOTATIONS; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.BUILDER; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.CLASS_NAME; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.ENUM_IMPORT_IT_SELF_IN_SCALA; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.EQUALS_AND_HASH_CODE; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.FIELDS; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.GENERATED_ANNOTATION; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.GENERATED_INFO; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.GENERATE_MODEL_OPEN_CLASSES; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.IMMUTABLE_MODELS; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.JAVA_DOC; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.NAME; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.PACKAGE; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.TO_STRING; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.TO_STRING_FOR_REQUEST; /** * Map input type definition to a Freemarker data model @@ -21,10 +35,10 @@ public class InputDefinitionToDataModelMapper { public InputDefinitionToDataModelMapper(GraphQLTypeMapper graphQLTypeMapper, DataModelMapper dataModelMapper, - InputValueDefinitionToParameterMapper inputValueDefinitionToParameterMapper) { + InputValueDefinitionToParameterMapper inputValueDefToParamMapper) { this.graphQLTypeMapper = graphQLTypeMapper; this.dataModelMapper = dataModelMapper; - this.inputValueDefinitionToParameterMapper = inputValueDefinitionToParameterMapper; + this.inputValueDefinitionToParameterMapper = inputValueDefToParamMapper; } /** @@ -41,7 +55,8 @@ public Map map(MappingContext mappingContext, ExtendedInputObjec dataModel.put(CLASS_NAME, dataModelMapper.getModelClassNameWithPrefixAndSuffix(mappingContext, definition)); dataModel.put(JAVA_DOC, definition.getJavaDoc()); dataModel.put(NAME, definition.getName()); - dataModel.put(FIELDS, inputValueDefinitionToParameterMapper.map(mappingContext, definition.getValueDefinitions(), definition.getName())); + dataModel.put(FIELDS, inputValueDefinitionToParameterMapper + .map(mappingContext, definition.getValueDefinitions(), definition.getName())); dataModel.put(ANNOTATIONS, graphQLTypeMapper.getAnnotations(mappingContext, definition)); dataModel.put(BUILDER, mappingContext.getGenerateBuilder()); dataModel.put(EQUALS_AND_HASH_CODE, mappingContext.getGenerateEqualsAndHashCode()); diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/InputValueDefinitionToParameterMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/InputValueDefinitionToParameterMapper.java index 62450e14d..83ed0faa4 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/InputValueDefinitionToParameterMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/InputValueDefinitionToParameterMapper.java @@ -36,7 +36,8 @@ public InputValueDefinitionToParameterMapper(ValueMapper valueMapper, * @param parentTypeName Name of the parent GraphQL type * @return Freemarker data model of the GraphQL input value definition */ - public List map(MappingContext mappingContext, List valueDefinitions, String parentTypeName) { + public List map(MappingContext mappingContext, List valueDefinitions, + String parentTypeName) { return valueDefinitions.stream() .map(inputValueDef -> map(mappingContext, inputValueDef, parentTypeName)) .collect(toList()); @@ -50,15 +51,21 @@ public List map(MappingContext mappingContext, List map(MappingContext mappingContext, ExtendedInterfaceT dataModel.put(JAVA_DOC, definition.getJavaDoc()); dataModel.put(IMPLEMENTS, getInterfaces(mappingContext, definition)); dataModel.put(ANNOTATIONS, graphQLTypeMapper.getAnnotations(mappingContext, definition)); - dataModel.put(FIELDS, fieldDefinitionToParameterMapper.mapFields(mappingContext, definition.getFieldDefinitions(), definition)); + dataModel.put(FIELDS, fieldDefinitionToParameterMapper + .mapFields(mappingContext, definition.getFieldDefinitions(), definition)); dataModel.put(GENERATED_ANNOTATION, mappingContext.getAddGeneratedAnnotation()); dataModel.put(GENERATED_INFO, mappingContext.getGeneratedInformation()); dataModel.put(ENUM_IMPORT_IT_SELF_IN_SCALA, mappingContext.getEnumImportItSelfInScala()); diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/RequestResponseDefinitionToDataModelMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/RequestResponseDefinitionToDataModelMapper.java index d601d35c3..5e07babab 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/RequestResponseDefinitionToDataModelMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/RequestResponseDefinitionToDataModelMapper.java @@ -25,8 +25,8 @@ import static com.kobylynskyi.graphql.codegen.model.DataModelFields.ENUM_IMPORT_IT_SELF_IN_SCALA; import static com.kobylynskyi.graphql.codegen.model.DataModelFields.EQUALS_AND_HASH_CODE; import static com.kobylynskyi.graphql.codegen.model.DataModelFields.FIELDS; -import static com.kobylynskyi.graphql.codegen.model.DataModelFields.GENERATED_INFO; import static com.kobylynskyi.graphql.codegen.model.DataModelFields.GENERATED_ANNOTATION; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.GENERATED_INFO; import static com.kobylynskyi.graphql.codegen.model.DataModelFields.JAVA_DOC; import static com.kobylynskyi.graphql.codegen.model.DataModelFields.METHOD_NAME; import static com.kobylynskyi.graphql.codegen.model.DataModelFields.OPERATION_NAME; @@ -52,11 +52,11 @@ public class RequestResponseDefinitionToDataModelMapper { public RequestResponseDefinitionToDataModelMapper(GraphQLTypeMapper graphQLTypeMapper, DataModelMapper dataModelMapper, FieldDefinitionToParameterMapper fieldDefinitionToParameterMapper, - InputValueDefinitionToParameterMapper inputValueDefinitionToParameterMapper) { + InputValueDefinitionToParameterMapper inputValDefToParamMapper) { this.graphQLTypeMapper = graphQLTypeMapper; this.dataModelMapper = dataModelMapper; this.fieldDefinitionToParameterMapper = fieldDefinitionToParameterMapper; - this.inputValueDefinitionToParameterMapper = inputValueDefinitionToParameterMapper; + this.inputValueDefinitionToParameterMapper = inputValDefToParamMapper; } /** @@ -81,26 +81,6 @@ private static String getClassName(ExtendedFieldDefinition operationDef, return classNameBuilder.toString(); } - /** - * Get merged attributes from the type and attributes from the interface. - * - * @param mappingContext Global mapping context - * @param unionDefinition GraphQL union definition - * @return Freemarker data model for response projection of the GraphQL union - */ - private static Collection getProjectionFields( - MappingContext mappingContext, ExtendedUnionTypeDefinition unionDefinition) { - // using the map to exclude duplicate fields from the type and interfaces - Map allParameters = new LinkedHashMap<>(); - for (String memberTypeName : unionDefinition.getMemberTypeNames()) { - ProjectionParameterDefinition memberDef = getChildDefinition(mappingContext, memberTypeName); - allParameters.put(memberDef.getMethodName(), memberDef); - } - ProjectionParameterDefinition typeNameProjParamDef = getTypeNameProjectionParameterDefinition(); - allParameters.put(typeNameProjParamDef.getMethodName(), typeNameProjParamDef); - return allParameters.values(); - } - private static ProjectionParameterDefinition getChildDefinition(MappingContext mappingContext, String childName) { ProjectionParameterDefinition parameter = new ProjectionParameterDefinition(); @@ -154,14 +134,16 @@ public Map mapResponseProjection(MappingContext mappingContext, public Map mapParametrizedInput(MappingContext mappingContext, ExtendedFieldDefinition fieldDefinition, ExtendedDefinition parentTypeDefinition) { - String className = DataModelMapper.getParametrizedInputClassName(mappingContext, fieldDefinition, parentTypeDefinition); + String className = DataModelMapper + .getParametrizedInputClassName(mappingContext, fieldDefinition, parentTypeDefinition); Map dataModel = new HashMap<>(); // ParametrizedInput classes are sharing the package with the model classes, so no imports are needed dataModel.put(PACKAGE, DataModelMapper.getModelPackageName(mappingContext)); dataModel.put(CLASS_NAME, className); dataModel.put(ANNOTATIONS, graphQLTypeMapper.getAnnotations(mappingContext, className)); dataModel.put(JAVA_DOC, Collections.singletonList(String.format("Parametrized input for field %s in type %s", - fieldDefinition.getName(), parentTypeDefinition.getName()))); + fieldDefinition.getName(), + parentTypeDefinition.getName()))); dataModel.put(FIELDS, inputValueDefinitionToParameterMapper.map( mappingContext, fieldDefinition.getInputValueDefinitions(), parentTypeDefinition.getName())); dataModel.put(BUILDER, mappingContext.getGenerateBuilder()); @@ -189,7 +171,8 @@ public Map mapResponse(MappingContext mappingContext, String className = getClassName(operationDef, fieldNames, objectTypeName, mappingContext.getResponseSuffix()); NamedDefinition namedDefinition = graphQLTypeMapper.getLanguageType( mappingContext, operationDef.getType(), operationDef.getName(), objectTypeName); - String returnType = graphQLTypeMapper.getResponseReturnType(mappingContext, namedDefinition, namedDefinition.getJavaName()); + String returnType = graphQLTypeMapper + .getResponseReturnType(mappingContext, namedDefinition, namedDefinition.getJavaName()); Map dataModel = new HashMap<>(); // Response classes are sharing the package with the model classes, so no imports are needed dataModel.put(PACKAGE, DataModelMapper.getModelPackageName(mappingContext)); @@ -198,7 +181,8 @@ public Map mapResponse(MappingContext mappingContext, dataModel.put(JAVA_DOC, operationDef.getJavaDoc()); dataModel.put(DEPRECATED, operationDef.getDeprecated(mappingContext)); dataModel.put(OPERATION_NAME, operationDef.getName()); - dataModel.put(METHOD_NAME, dataModelMapper.capitalizeMethodNameIfRestricted(mappingContext, operationDef.getName())); + dataModel.put(METHOD_NAME, dataModelMapper.capitalizeMethodNameIfRestricted( + mappingContext, operationDef.getName())); dataModel.put(RETURN_TYPE_NAME, returnType); dataModel.put(GENERATED_ANNOTATION, mappingContext.getAddGeneratedAnnotation()); dataModel.put(GENERATED_INFO, mappingContext.getGeneratedInformation()); @@ -228,7 +212,8 @@ public Map mapRequest(MappingContext mappingContext, dataModel.put(JAVA_DOC, operationDef.getJavaDoc()); dataModel.put(OPERATION_NAME, operationDef.getName()); dataModel.put(OPERATION_TYPE, objectTypeName.toUpperCase()); - dataModel.put(FIELDS, inputValueDefinitionToParameterMapper.map(mappingContext, operationDef.getInputValueDefinitions(), operationDef.getName())); + dataModel.put(FIELDS, inputValueDefinitionToParameterMapper + .map(mappingContext, operationDef.getInputValueDefinitions(), operationDef.getName())); dataModel.put(BUILDER, mappingContext.getGenerateBuilder()); dataModel.put(EQUALS_AND_HASH_CODE, mappingContext.getGenerateEqualsAndHashCode()); dataModel.put(TO_STRING, mappingContext.getGenerateToString()); @@ -239,6 +224,26 @@ public Map mapRequest(MappingContext mappingContext, return dataModel; } + /** + * Get merged attributes from the type and attributes from the interface. + * + * @param mappingContext Global mapping context + * @param unionDefinition GraphQL union definition + * @return Freemarker data model for response projection of the GraphQL union + */ + private static Collection getProjectionFields( + MappingContext mappingContext, ExtendedUnionTypeDefinition unionDefinition) { + // using the map to exclude duplicate fields from the type and interfaces + Map allParameters = new LinkedHashMap<>(); + for (String memberTypeName : unionDefinition.getMemberTypeNames()) { + ProjectionParameterDefinition memberDef = getChildDefinition(mappingContext, memberTypeName); + allParameters.put(memberDef.getMethodName(), memberDef); + } + ProjectionParameterDefinition typeNameProjParamDef = getTypeNameProjectionParameterDefinition(); + allParameters.put(typeNameProjParamDef.getMethodName(), typeNameProjParamDef); + return allParameters.values(); + } + /** * Get merged attributes from the type and attributes from the interface. * @@ -271,12 +276,15 @@ private Collection getProjectionFields( // using the map to exclude duplicate fields from the type and interfaces Map allParameters = new LinkedHashMap<>(); // includes parameters from the base definition and extensions - fieldDefinitionToParameterMapper.mapProjectionFields(mappingContext, typeDefinition.getFieldDefinitions(), typeDefinition) + fieldDefinitionToParameterMapper + .mapProjectionFields(mappingContext, typeDefinition.getFieldDefinitions(), typeDefinition) .forEach(p -> allParameters.put(p.getMethodName(), p)); // includes parameters from the interface - List interfacesOfType = DataModelMapper.getInterfacesOfType(typeDefinition, mappingContext.getDocument()); + List interfacesOfType = DataModelMapper + .getInterfacesOfType(typeDefinition, mappingContext.getDocument()); interfacesOfType.stream() - .map(i -> fieldDefinitionToParameterMapper.mapProjectionFields(mappingContext, i.getFieldDefinitions(), i)) + .map(i -> fieldDefinitionToParameterMapper + .mapProjectionFields(mappingContext, i.getFieldDefinitions(), i)) .flatMap(Collection::stream) .filter(paramDef -> !allParameters.containsKey(paramDef.getMethodName())) .forEach(paramDef -> allParameters.put(paramDef.getMethodName(), paramDef)); @@ -297,17 +305,20 @@ private Collection getProjectionFields( // using the map to exclude duplicate fields from the type and interfaces Map allParameters = new LinkedHashMap<>(); // includes parameters from the base definition and extensions - fieldDefinitionToParameterMapper.mapProjectionFields(mappingContext, interfaceDefinition.getFieldDefinitions(), interfaceDefinition) + fieldDefinitionToParameterMapper + .mapProjectionFields(mappingContext, interfaceDefinition.getFieldDefinitions(), interfaceDefinition) .forEach(p -> allParameters.put(p.getMethodName(), p)); // includes parameters from the interface DataModelMapper.getInterfacesOfType(interfaceDefinition, mappingContext.getDocument()).stream() - .map(i -> fieldDefinitionToParameterMapper.mapProjectionFields(mappingContext, i.getFieldDefinitions(), i)) + .map(i -> fieldDefinitionToParameterMapper + .mapProjectionFields(mappingContext, i.getFieldDefinitions(), i)) .flatMap(Collection::stream) .filter(paramDef -> !allParameters.containsKey(paramDef.getMethodName())) .forEach(paramDef -> allParameters.put(paramDef.getMethodName(), paramDef)); Set interfaceChildren = mappingContext.getInterfaceChildren() - .getOrDefault(interfaceDefinition.getName(), Collections.emptySet()); + .getOrDefault(interfaceDefinition.getName(), + Collections.emptySet()); for (String childName : interfaceChildren) { ProjectionParameterDefinition childDef = getChildDefinition(mappingContext, childName); allParameters.put(childDef.getMethodName(), childDef); diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/TypeDefinitionToDataModelMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/TypeDefinitionToDataModelMapper.java index 7299386ad..e6f72cb6e 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/TypeDefinitionToDataModelMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/TypeDefinitionToDataModelMapper.java @@ -124,7 +124,8 @@ private Collection getFields(MappingContext mappingContext, DataModelMapper.getInterfacesOfType(typeDefinition, document).stream() .map(i -> fieldDefinitionToParameterMapper.mapFields(mappingContext, i.getFieldDefinitions(), i)) .flatMap(Collection::stream) - .forEach(paramDef -> allParameters.merge(paramDef.getName(), paramDef, TypeDefinitionToDataModelMapper::merge)); + .forEach(paramDef -> allParameters + .merge(paramDef.getName(), paramDef, TypeDefinitionToDataModelMapper::merge)); return allParameters.values(); } @@ -134,11 +135,13 @@ private Set getInterfaces(MappingContext mappingContext, .stream() .filter(union -> union.isDefinitionPartOfUnion(definition)) .map(ExtendedUnionTypeDefinition::getName) - .map(unionName -> DataModelMapper.getModelClassNameWithPrefixAndSuffix(mappingContext, unionName)) + .map(unionName -> DataModelMapper + .getModelClassNameWithPrefixAndSuffix(mappingContext, unionName)) .collect(Collectors.toList()); Set interfaceNames = definition.getImplements() .stream() - .map(anImplement -> graphQLTypeMapper.getLanguageType(mappingContext, anImplement)) + .map(anImplement -> graphQLTypeMapper + .getLanguageType(mappingContext, anImplement)) .collect(Collectors.toSet()); Set allInterfaces = new LinkedHashSet<>(); diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/UnionDefinitionToDataModelMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/UnionDefinitionToDataModelMapper.java index 52fe0f061..eead1353f 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/UnionDefinitionToDataModelMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/UnionDefinitionToDataModelMapper.java @@ -9,8 +9,8 @@ import static com.kobylynskyi.graphql.codegen.model.DataModelFields.ANNOTATIONS; import static com.kobylynskyi.graphql.codegen.model.DataModelFields.CLASS_NAME; import static com.kobylynskyi.graphql.codegen.model.DataModelFields.ENUM_IMPORT_IT_SELF_IN_SCALA; -import static com.kobylynskyi.graphql.codegen.model.DataModelFields.GENERATED_INFO; import static com.kobylynskyi.graphql.codegen.model.DataModelFields.GENERATED_ANNOTATION; +import static com.kobylynskyi.graphql.codegen.model.DataModelFields.GENERATED_INFO; import static com.kobylynskyi.graphql.codegen.model.DataModelFields.JAVA_DOC; import static com.kobylynskyi.graphql.codegen.model.DataModelFields.PACKAGE; diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/ValueFormatter.java b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/ValueFormatter.java index 801e1e382..d887a9757 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/ValueFormatter.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/ValueFormatter.java @@ -16,6 +16,13 @@ static String format(String value, String formatter) { return FORMATTER_TO_STRING.equals(formatter) ? "\"" + value + "\"" : value; } + /** + * Format a list of values to a single string according to a formatter + * + * @param values values to be formatted + * @param formatter value formatter + * @return formatted string + */ default String formatList(List values, String formatter) { if (values == null) { return format(getNullValue(), formatter); diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/ValueMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/ValueMapper.java index 23bd819aa..665c070c1 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/ValueMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/ValueMapper.java @@ -19,6 +19,9 @@ import java.util.List; import java.util.stream.Collectors; +/** + * A class for mapping GraphQL value to a java value + */ public class ValueMapper { private static final String NULL_STRING = "null"; @@ -36,10 +39,20 @@ private static String mapBoolean(BooleanValue value) { return value.isValue() ? "true" : "false"; } - //TODO It should also be abstracted. Different languages have different default values(It is now implemented in templates (templates are extremely complex)) + /** + * Map value of GraphQL Int type to a value that will be present in a generated code. + * TODO: should also be abstracted because different languages have different default values + * + * @param mappingContext Global mapping context + * @param value GraphQL Value + * @param graphQLType GraphQL Type + * @return formatted value + */ private static String mapInt(MappingContext mappingContext, IntValue value, Type graphQLType) { - //default java basic type is `int`. so, default value like 123 that must wrap or append suffix `L` when it be defined as `int` in graphql schema. - //`int` cannot assign to `Long`, also `double` cannot assign to `Float`, but graphql Float default mapping is Double in java, so, not modify `mapFloat`. + // default java basic type is `int`. so, default value like 123 that must wrap or append suffix `L` when it be + // defined as `int` in graphql schema. + // `int` cannot assign to `Long`, also `double` cannot assign to `Float`, but graphql Float default mapping is + // Double in java, so, not modify `mapFloat`. if (graphQLType instanceof TypeName) { String customType = mappingContext.getCustomTypesMapping().get("Long"); String typeName = ((TypeName) graphQLType).getName(); @@ -67,6 +80,15 @@ public String map(MappingContext mappingContext, Value value, Type graphQL return map(mappingContext, value, graphQLType, null); } + /** + * Map GraphQL value of a given type according to a formatter + * + * @param mappingContext Global mapping context + * @param value GraphQL Value + * @param graphQLType GraphQL Type + * @param formatter value formatter + * @return formatted value + */ public String map(MappingContext mappingContext, Value value, Type graphQLType, String formatter) { if (value instanceof NullValue) { diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/ApiInterfaceStrategy.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/ApiInterfaceStrategy.java index c4e1a00e2..1eeb7efc9 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/ApiInterfaceStrategy.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/ApiInterfaceStrategy.java @@ -1,5 +1,8 @@ package com.kobylynskyi.graphql.codegen.model; +/** + * Strategy for creating API interface calsses + */ public enum ApiInterfaceStrategy { /** diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/ApiNamePrefixStrategy.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/ApiNamePrefixStrategy.java index a88746255..4a332486b 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/ApiNamePrefixStrategy.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/ApiNamePrefixStrategy.java @@ -1,5 +1,8 @@ package com.kobylynskyi.graphql.codegen.model; +/** + * Strategy of defining the prefix for all generated API interface classes + */ public enum ApiNamePrefixStrategy { /** diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/ApiRootInterfaceStrategy.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/ApiRootInterfaceStrategy.java index 772bea4f8..e83003368 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/ApiRootInterfaceStrategy.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/ApiRootInterfaceStrategy.java @@ -1,5 +1,8 @@ package com.kobylynskyi.graphql.codegen.model; +/** + * Strategy of how root API interface (Query/Mutation/Subscription) will be generated + */ public enum ApiRootInterfaceStrategy { /** diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/EnumValueDefinition.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/EnumValueDefinition.java index 7eb9eb48d..2a9c59c8a 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/EnumValueDefinition.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/EnumValueDefinition.java @@ -14,7 +14,8 @@ public class EnumValueDefinition { private final List javaDoc; private final DeprecatedDefinition deprecated; - public EnumValueDefinition(String javaName, String graphqlName, List javaDoc, DeprecatedDefinition deprecated) { + public EnumValueDefinition(String javaName, String graphqlName, List javaDoc, + DeprecatedDefinition deprecated) { this.javaName = javaName; this.graphqlName = graphqlName; this.javaDoc = javaDoc; diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/GeneratedInformation.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/GeneratedInformation.java index ab6d244f2..b47024c09 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/GeneratedInformation.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/GeneratedInformation.java @@ -4,6 +4,9 @@ import java.time.format.DateTimeFormatter; import java.util.function.Supplier; +/** + * A class used for building a @Generated annotation on top of each generated class + */ public class GeneratedInformation { public static final DateTimeFormatter DATE_TIME_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ"); diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/GeneratedLanguage.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/GeneratedLanguage.java index 70ddd559e..2eb310734 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/GeneratedLanguage.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/GeneratedLanguage.java @@ -1,5 +1,8 @@ package com.kobylynskyi.graphql.codegen.model; +/** + * Enum containing all supported langugages for code generation + */ public enum GeneratedLanguage { JAVA(".java"), diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/GraphQLCodegenConfiguration.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/GraphQLCodegenConfiguration.java index fbaadc16d..2095db193 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/GraphQLCodegenConfiguration.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/GraphQLCodegenConfiguration.java @@ -11,14 +11,14 @@ public interface GraphQLCodegenConfiguration { /** * Can be used to supply custom mappings for scalars. - *

- * Supports: + * + *

Supports: *

    *
  • Map of (GraphqlObjectName.fieldName) to (JavaType)
  • *
  • Map of (GraphqlType) to (JavaType)
  • *
- *

- * E.g.: + * + *

E.g.: *

    *
  • {@code DateTime --- String}
  • *
  • {@code Price.amount --- java.math.BigDecimal}
  • @@ -30,15 +30,16 @@ public interface GraphQLCodegenConfiguration { /** * Can be used to supply custom annotations (serializers) for scalars. - *

    - * Supports: + * + *

    Supports: *

      *
    • Map of (GraphqlObjectName.fieldName) to (JavaAnnotation)
    • *
    • Map of (GraphqlType) to (JavaAnnotation)
    • *
    - *

    - * E.g.: - * {@code EpochMillis --- @com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = com.example.json.EpochMillisScalarDeserializer.class)} + * + *

    E.g.: + * {@code EpochMillis --- @com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = com.example.json + * .EpochMillisScalarDeserializer.class)} * * @return mappings from GraphqlType to JavaAnnotation */ @@ -46,14 +47,15 @@ public interface GraphQLCodegenConfiguration { /** * Map GraphQL directives to Java annotations. - *

    - * Directive fields can be used in annotations via: {{directiveFieldName}} - *

    - * Example: - *

    - * schema: directive @auth (roles: [String]) - *

    - * {@code directiveAnnotationsMapping: auth --- @org.springframework.security.access.annotation.Secured({{roles}})} + * + *

    Directive fields can be used in annotations via: {{directiveFieldName}} + * + *

    Example: + * + *

    schema: directive @auth (roles: [String]) + * + *

    {@code directiveAnnotationsMapping: + * auth --- @org.springframework.security.access.annotation.Secured({{roles}})} * * @return mappings from GraphQL directives to Java annotations. */ @@ -266,12 +268,12 @@ public interface GraphQLCodegenConfiguration { /** * Fields that require Resolvers. - *

    - * Values should be defined here in format: TypeName, TypeName.fieldName, @directive - *

    - * If just type is specified, then all fields of this type will have resolvers. - *

    - * E.g.: + * + *

    Values should be defined here in format: TypeName, TypeName.fieldName, @directive + * + *

    If just type is specified, then all fields of this type will have resolvers. + * + *

    E.g.: *

      *
    • {@code Person}
    • *
    • {@code Person.friends}
    • @@ -284,14 +286,14 @@ public interface GraphQLCodegenConfiguration { /** * Fields that DO NOT require Resolvers. - *

      - * Values should be defined here in format: TypeName, TypeName.fieldName, @directive - *

      - * If just type is specified, then all fields of this type will NOT have resolvers. - *

      - * Can be used in conjunction with {@code generateExtensionFieldsResolvers} - *

      - * E.g.: + * + *

      Values should be defined here in format: TypeName, TypeName.fieldName, @directive + * + *

      If just type is specified, then all fields of this type will NOT have resolvers. + * + *

      Can be used in conjunction with {@code generateExtensionFieldsResolvers} + * + *

      E.g.: *

        *
      • {@code Person}
      • *
      • {@code Person.friends}
      • @@ -383,12 +385,12 @@ public interface GraphQLCodegenConfiguration { /** * Fields that require serialization using * {@link com.fasterxml.jackson.databind.ObjectMapper#writeValueAsString(Object)} - *

        - * Values should be defined here in format: GraphqlObjectName.fieldName or GraphqlTypeName - *

        - * If just type is specified, then all fields of this type will be serialized using ObjectMapper. - *

        - * E.g.: + * + *

        Values should be defined here in format: GraphqlObjectName.fieldName or GraphqlTypeName + * + *

        If just type is specified, then all fields of this type will be serialized using ObjectMapper. + * + *

        E.g.: *

          *
        • {@code Person.createdDateTime}
        • *
        • {@code ZonedDateTime}
        • diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfig.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfig.java index 9f9e9b6db..c1dab9333 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfig.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfig.java @@ -116,45 +116,66 @@ public void combine(MappingConfig source) { modelNameSuffix = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getModelNameSuffix); apiNamePrefix = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getApiNamePrefix); apiNameSuffix = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getApiNameSuffix); - apiRootInterfaceStrategy = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getApiRootInterfaceStrategy); + apiRootInterfaceStrategy = getValueOrDefaultToThis(source, + GraphQLCodegenConfiguration::getApiRootInterfaceStrategy); apiInterfaceStrategy = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getApiInterfaceStrategy); apiNamePrefixStrategy = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getApiNamePrefixStrategy); typeResolverPrefix = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getTypeResolverPrefix); typeResolverSuffix = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getTypeResolverSuffix); - modelValidationAnnotation = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getModelValidationAnnotation); + modelValidationAnnotation = getValueOrDefaultToThis(source, + GraphQLCodegenConfiguration::getModelValidationAnnotation); apiReturnType = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getApiReturnType); apiReturnListType = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getApiReturnListType); - subscriptionReturnType = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getSubscriptionReturnType); + subscriptionReturnType = getValueOrDefaultToThis(source, + GraphQLCodegenConfiguration::getSubscriptionReturnType); generateBuilder = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getGenerateBuilder); - generateEqualsAndHashCode = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getGenerateEqualsAndHashCode); - generateImmutableModels = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getGenerateImmutableModels); + generateEqualsAndHashCode = getValueOrDefaultToThis(source, + GraphQLCodegenConfiguration::getGenerateEqualsAndHashCode); + generateImmutableModels = getValueOrDefaultToThis(source, + GraphQLCodegenConfiguration::getGenerateImmutableModels); generateToString = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getGenerateToString); - generateParameterizedFieldsResolvers = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getGenerateParameterizedFieldsResolvers); - generateExtensionFieldsResolvers = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getGenerateExtensionFieldsResolvers); - generateDataFetchingEnvironmentArgumentInApis = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getGenerateDataFetchingEnvironmentArgumentInApis); - generateModelsForRootTypes = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getGenerateModelsForRootTypes); - useOptionalForNullableReturnTypes = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getUseOptionalForNullableReturnTypes); - generateApisWithThrowsException = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getGenerateApisWithThrowsException); - addGeneratedAnnotation = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getAddGeneratedAnnotation); + generateParameterizedFieldsResolvers = getValueOrDefaultToThis(source, + GraphQLCodegenConfiguration::getGenerateParameterizedFieldsResolvers); + generateExtensionFieldsResolvers = getValueOrDefaultToThis(source, + GraphQLCodegenConfiguration::getGenerateExtensionFieldsResolvers); + generateDataFetchingEnvironmentArgumentInApis = getValueOrDefaultToThis(source, + GraphQLCodegenConfiguration::getGenerateDataFetchingEnvironmentArgumentInApis); + generateModelsForRootTypes = getValueOrDefaultToThis(source, + GraphQLCodegenConfiguration::getGenerateModelsForRootTypes); + useOptionalForNullableReturnTypes = getValueOrDefaultToThis(source, + GraphQLCodegenConfiguration::getUseOptionalForNullableReturnTypes); + generateApisWithThrowsException = getValueOrDefaultToThis(source, + GraphQLCodegenConfiguration::getGenerateApisWithThrowsException); + addGeneratedAnnotation = getValueOrDefaultToThis(source, + GraphQLCodegenConfiguration::getAddGeneratedAnnotation); relayConfig = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getRelayConfig); - queryResolverParentInterface = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getQueryResolverParentInterface); - mutationResolverParentInterface = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getMutationResolverParentInterface); - subscriptionResolverParentInterface = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getSubscriptionResolverParentInterface); - resolverParentInterface = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getResolverParentInterface); + queryResolverParentInterface = getValueOrDefaultToThis(source, + GraphQLCodegenConfiguration::getQueryResolverParentInterface); + mutationResolverParentInterface = getValueOrDefaultToThis(source, + GraphQLCodegenConfiguration::getMutationResolverParentInterface); + subscriptionResolverParentInterface = getValueOrDefaultToThis(source, + GraphQLCodegenConfiguration::getSubscriptionResolverParentInterface); + resolverParentInterface = getValueOrDefaultToThis(source, + GraphQLCodegenConfiguration::getResolverParentInterface); generateClient = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getGenerateClient); requestSuffix = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getRequestSuffix); responseSuffix = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getResponseSuffix); - responseProjectionSuffix = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getResponseProjectionSuffix); - parametrizedInputSuffix = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getParametrizedInputSuffix); + responseProjectionSuffix = getValueOrDefaultToThis(source, + GraphQLCodegenConfiguration::getResponseProjectionSuffix); + parametrizedInputSuffix = getValueOrDefaultToThis(source, + GraphQLCodegenConfiguration::getParametrizedInputSuffix); fieldsWithResolvers = combineSet(fieldsWithResolvers, source.fieldsWithResolvers); fieldsWithoutResolvers = combineSet(fieldsWithoutResolvers, source.fieldsWithoutResolvers); customTypesMapping = combineMap(customTypesMapping, source.customTypesMapping); customAnnotationsMapping = combineMap(customAnnotationsMapping, source.customAnnotationsMapping); directiveAnnotationsMapping = combineMap(directiveAnnotationsMapping, source.directiveAnnotationsMapping); - responseProjectionMaxDepth = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getResponseProjectionMaxDepth); - useObjectMapperForRequestSerialization = combineSet(useObjectMapperForRequestSerialization, source.useObjectMapperForRequestSerialization); + responseProjectionMaxDepth = getValueOrDefaultToThis(source, + GraphQLCodegenConfiguration::getResponseProjectionMaxDepth); + useObjectMapperForRequestSerialization = combineSet(useObjectMapperForRequestSerialization, + source.useObjectMapperForRequestSerialization); generatedLanguage = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::getGeneratedLanguage); - generateModelOpenClasses = getValueOrDefaultToThis(source, GraphQLCodegenConfiguration::isGenerateModelOpenClasses); + generateModelOpenClasses = getValueOrDefaultToThis(source, + GraphQLCodegenConfiguration::isGenerateModelOpenClasses); } private T getValueOrDefaultToThis(MappingConfig source, Function getValueFunction) { @@ -414,7 +435,8 @@ public Boolean getGenerateDataFetchingEnvironmentArgumentInApis() { return generateDataFetchingEnvironmentArgumentInApis; } - public void setGenerateDataFetchingEnvironmentArgumentInApis(Boolean generateDataFetchingEnvironmentArgumentInApis) { + public void setGenerateDataFetchingEnvironmentArgumentInApis( + Boolean generateDataFetchingEnvironmentArgumentInApis) { this.generateDataFetchingEnvironmentArgumentInApis = generateDataFetchingEnvironmentArgumentInApis; } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfigConstants.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfigConstants.java index 46a73963f..b971e9986 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfigConstants.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingConfigConstants.java @@ -1,5 +1,8 @@ package com.kobylynskyi.graphql.codegen.model; +/** + * Various constants used in code generation process + */ public class MappingConfigConstants { public static final String DEFAULT_VALIDATION_ANNOTATION = "javax.validation.constraints.NotNull"; @@ -30,9 +33,11 @@ public class MappingConfigConstants { public static final String DEFAULT_USE_OPTIONAL_FOR_NULLABLE_RETURN_TYPES_STRING = "false"; public static final ApiNamePrefixStrategy DEFAULT_API_NAME_PREFIX_STRATEGY = ApiNamePrefixStrategy.CONSTANT; public static final String DEFAULT_API_NAME_PREFIX_STRATEGY_STRING = "CONSTANT"; - public static final ApiRootInterfaceStrategy DEFAULT_API_ROOT_INTERFACE_STRATEGY = ApiRootInterfaceStrategy.SINGLE_INTERFACE; + public static final ApiRootInterfaceStrategy DEFAULT_API_ROOT_INTERFACE_STRATEGY = + ApiRootInterfaceStrategy.SINGLE_INTERFACE; public static final String DEFAULT_API_ROOT_INTERFACE_STRATEGY_STRING = "SINGLE_INTERFACE"; - public static final ApiInterfaceStrategy DEFAULT_API_INTERFACE_STRATEGY = ApiInterfaceStrategy.INTERFACE_PER_OPERATION; + public static final ApiInterfaceStrategy DEFAULT_API_INTERFACE_STRATEGY = + ApiInterfaceStrategy.INTERFACE_PER_OPERATION; public static final String DEFAULT_API_INTERFACE_STRATEGY_STRING = "INTERFACE_PER_OPERATION"; public static final boolean DEFAULT_GENERATE_CLIENT = false; public static final String DEFAULT_GENERATE_CLIENT_STRING = "false"; diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingContext.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingContext.java index 99d200f0c..2103de6cc 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingContext.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/MappingContext.java @@ -2,7 +2,11 @@ import com.kobylynskyi.graphql.codegen.mapper.DataModelMapper; import com.kobylynskyi.graphql.codegen.mapper.DataModelMapperFactory; -import com.kobylynskyi.graphql.codegen.model.definitions.*; +import com.kobylynskyi.graphql.codegen.model.definitions.ExtendedDefinition; +import com.kobylynskyi.graphql.codegen.model.definitions.ExtendedDocument; +import com.kobylynskyi.graphql.codegen.model.definitions.ExtendedEnumTypeDefinition; +import com.kobylynskyi.graphql.codegen.model.definitions.ExtendedFieldDefinition; +import com.kobylynskyi.graphql.codegen.model.definitions.ExtendedInterfaceTypeDefinition; import java.util.HashMap; import java.util.List; @@ -10,6 +14,10 @@ import java.util.Set; import java.util.stream.Collectors; +/** + * A context of a single mapping process. + * Contains mapping configuration, parsed schema elements and other things used in code generation process + */ public class MappingContext implements GraphQLCodegenConfiguration { private final MappingConfig config; @@ -18,9 +26,9 @@ public class MappingContext implements GraphQLCodegenConfiguration { private final Set interfacesName; private final Map> interfaceChildren; private final GeneratedInformation generatedInformation; + private final DataModelMapperFactory dataModelMapperFactory; private Set enumImportItSelfInScala = null; private Map> parentInterfaceProperties = null; - private final DataModelMapperFactory dataModelMapperFactory; public MappingContext(MappingConfig mappingConfig, ExtendedDocument document, @@ -292,22 +300,31 @@ public GeneratedInformation getGeneratedInformation() { public Set getEnumImportItSelfInScala() { // Only for scala if (GeneratedLanguage.SCALA.equals(this.config.getGeneratedLanguage()) && enumImportItSelfInScala == null) { - enumImportItSelfInScala = this.document.getEnumDefinitions().stream().map(this::getModelClassNameWithPrefixAndSuffix).collect(Collectors.toSet()); + enumImportItSelfInScala = this.document.getEnumDefinitions().stream() + .map(this::getModelClassNameWithPrefixAndSuffix) + .collect(Collectors.toSet()); } return enumImportItSelfInScala; } + /** + * Get a list of fields for each interface + * This method is used only for Scala and Kotlin + * + * @return a map of interface name to a list of fields + */ public Map> getParentInterfaceProperties() { // In this way, we no longer need to rely on the order in which files are created // Only for scala/kotlin if ((GeneratedLanguage.SCALA.equals(this.config.getGeneratedLanguage()) || - GeneratedLanguage.KOTLIN.equals(this.config.getGeneratedLanguage())) - && parentInterfaceProperties == null) { + GeneratedLanguage.KOTLIN.equals(this.config.getGeneratedLanguage())) && + parentInterfaceProperties == null) { parentInterfaceProperties = new HashMap<>(); - for (ExtendedInterfaceTypeDefinition extendedInterfaceTypeDefinition : this.document.getInterfaceDefinitions()) { - String clazzName = getModelClassNameWithPrefixAndSuffix(extendedInterfaceTypeDefinition); - Set fields = getFields(extendedInterfaceTypeDefinition.getFieldDefinitions(), - extendedInterfaceTypeDefinition).stream().map(ParameterDefinition::getName).collect(Collectors.toSet()); + for (ExtendedInterfaceTypeDefinition interfaceDef : this.document.getInterfaceDefinitions()) { + String clazzName = getModelClassNameWithPrefixAndSuffix(interfaceDef); + Set fields = getFields(interfaceDef.getFieldDefinitions(), interfaceDef).stream() + .map(ParameterDefinition::getName) + .collect(Collectors.toSet()); if (parentInterfaceProperties.containsKey(clazzName)) { parentInterfaceProperties.get(clazzName).addAll(fields); } else { @@ -323,11 +340,14 @@ private String getModelClassNameWithPrefixAndSuffix(ExtendedEnumTypeDefinition e } private String getModelClassNameWithPrefixAndSuffix(ExtendedDefinition extendedDefinition) { - return this.dataModelMapperFactory.getDataModelMapper().getModelClassNameWithPrefixAndSuffix(this, extendedDefinition); + return this.dataModelMapperFactory.getDataModelMapper() + .getModelClassNameWithPrefixAndSuffix(this, extendedDefinition); } - private List getFields(List fieldDefinitions, ExtendedDefinition parentDefinition) { - return this.dataModelMapperFactory.getFieldDefinitionToParameterMapper().mapFields(this, fieldDefinitions, parentDefinition); + private List getFields(List fieldDefinitions, + ExtendedDefinition parentDefinition) { + return this.dataModelMapperFactory.getFieldDefToParamMapper() + .mapFields(this, fieldDefinitions, parentDefinition); } } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/MultiLanguageDeprecated.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/MultiLanguageDeprecated.java index 1a4a994b3..04cbc8ebf 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/MultiLanguageDeprecated.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/MultiLanguageDeprecated.java @@ -17,6 +17,14 @@ public class MultiLanguageDeprecated { private MultiLanguageDeprecated() { } + /** + * Get a definition of @deprecated annotation for a specified language. + * + * @param generatedLanguage Language of code generation + * @param directive GraphQL @deprecated directive + * @return a definition of a deprecation having reason and annotation + */ + @SuppressWarnings({"java:S1133", "java:S1123"}) // sonar treats this is a deprecated method public static DeprecatedDefinition getLanguageDeprecated(GeneratedLanguage generatedLanguage, Directive directive) { String msg = null; if (directive.getArguments().stream().anyMatch(argument -> argument.getName().equals(REASON))) { diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/NamedDefinition.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/NamedDefinition.java index 0c05aa274..ab8658dde 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/NamedDefinition.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/NamedDefinition.java @@ -1,5 +1,8 @@ package com.kobylynskyi.graphql.codegen.model; +/** + * Class describes a specific GraphQL type converted to a specific JVM language + */ public class NamedDefinition { private String javaName; diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/ParameterDefinition.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/ParameterDefinition.java index bce282e3e..98d4a5290 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/ParameterDefinition.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/ParameterDefinition.java @@ -117,11 +117,11 @@ public void setSerializeUsingObjectMapper(boolean serializeUsingObjectMapper) { this.serializeUsingObjectMapper = serializeUsingObjectMapper; } - public void setDefinitionInParentType(ParameterDefinition definitionInParentType) { - this.definitionInParentType = definitionInParentType; - } - public ParameterDefinition getDefinitionInParentType() { return definitionInParentType; } + + public void setDefinitionInParentType(ParameterDefinition definitionInParentType) { + this.definitionInParentType = definitionInParentType; + } } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/RelayConfig.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/RelayConfig.java index 210c280a2..d386c5274 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/RelayConfig.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/RelayConfig.java @@ -2,6 +2,9 @@ import java.io.Serializable; +/** + * Relay-related configurations + */ public class RelayConfig implements Serializable { // Increment this when the serialization output changes diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedDefinition.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedDefinition.java index 5a0bbb966..d04de0352 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedDefinition.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedDefinition.java @@ -53,6 +53,11 @@ public List getJavaDoc() { return javaDocFromDescription; } + /** + * Get java doc from description for this definition + * + * @return List of java docs + */ public List getJavaDocFromDescription() { List descriptions = new ArrayList<>(); if (this.definition instanceof AbstractDescribedNode) { @@ -70,6 +75,11 @@ public List getJavaDocFromDescription() { return descriptions; } + /** + * Get java doc from description for this definition + * + * @return List of java docs + */ public List getJavaDocFromComments() { List comments = new ArrayList<>(); if (definition != null && definition.getComments() != null) { @@ -85,6 +95,11 @@ public List getJavaDocFromComments() { return comments; } + /** + * Return all directives for this definition + * + * @return list of directive names + */ public List getDirectiveNames() { List directives = new ArrayList<>(); if (this.definition instanceof DirectivesContainer) { diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedDocument.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedDocument.java index 0272eb8ba..f8e089dca 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedDocument.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedDocument.java @@ -40,6 +40,11 @@ public ExtendedDocument(Collection operationDefini this.unionDefinitions = unionDefinitions; } + /** + * Get a joint list of names of all types, unions and interfaces + * + * @return Set containing all type names, union names, interface names + */ public Set getTypesUnionsInterfacesNames() { Set typesUnionsInterfaces = new LinkedHashSet<>(); typeDefinitions.stream() @@ -54,6 +59,11 @@ public Set getTypesUnionsInterfacesNames() { return typesUnionsInterfaces; } + /** + * Construct a map having interface name as a key and all children (that are extending this interface) as a value + * + * @return a map of interface name to all its children + */ public Map> getInterfaceChildren() { Map> interfaceChildren = new HashMap<>(); for (ExtendedObjectTypeDefinition typeDefinition : typeDefinitions) { diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedEnumTypeDefinition.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedEnumTypeDefinition.java index 461176200..d8facbc8e 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedEnumTypeDefinition.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedEnumTypeDefinition.java @@ -7,6 +7,9 @@ import java.util.ArrayList; import java.util.List; +/** + * Extended definition of GraphQL enum type: based definition + its extensions + */ public class ExtendedEnumTypeDefinition extends ExtendedDefinition { /** diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedFieldDefinition.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedFieldDefinition.java index cd83ea197..e349e6f78 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedFieldDefinition.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedFieldDefinition.java @@ -31,10 +31,16 @@ public DeprecatedDefinition getDeprecated(MappingContext mappingContext) { .stream() .filter(d -> d.getName().equalsIgnoreCase(Deprecated.class.getSimpleName())) .findFirst() - .map(directive -> MultiLanguageDeprecated.getLanguageDeprecated(mappingContext.getGeneratedLanguage(), directive)) + .map(directive -> MultiLanguageDeprecated + .getLanguageDeprecated(mappingContext.getGeneratedLanguage(), directive)) .orElse(null); } + /** + * Get java doc of GraphQL field + * + * @return a list of Java docs for this GraphQL field + */ public List getJavaDoc() { Description description = getDescription(); if (description != null && Utils.isNotBlank(description.getContent())) { diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedImplementingTypeDefinition.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedImplementingTypeDefinition.java index 7b4a7dae3..fb9a69dc2 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedImplementingTypeDefinition.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedImplementingTypeDefinition.java @@ -12,7 +12,8 @@ * @param base type * @param extension type */ -public abstract class ExtendedImplementingTypeDefinition, E extends T> extends ExtendedDefinition { +public abstract class ExtendedImplementingTypeDefinition, E extends T> + extends ExtendedDefinition { @SuppressWarnings({"rawtypes", "java:S3740"}) public List getImplements() { diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedInputObjectTypeDefinition.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedInputObjectTypeDefinition.java index 2bc341de6..8228c6c04 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedInputObjectTypeDefinition.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedInputObjectTypeDefinition.java @@ -7,7 +7,11 @@ import java.util.ArrayList; import java.util.List; -public class ExtendedInputObjectTypeDefinition extends ExtendedDefinition { +/** + * Extended definition of GraphQL input type: based definition + its extensions + */ +public class ExtendedInputObjectTypeDefinition + extends ExtendedDefinition { public List getValueDefinitions() { List definitions = new ArrayList<>(); diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedInterfaceTypeDefinition.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedInterfaceTypeDefinition.java index 26501dba6..27e893ce2 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedInterfaceTypeDefinition.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedInterfaceTypeDefinition.java @@ -7,8 +7,17 @@ import java.util.Collection; import java.util.List; -public class ExtendedInterfaceTypeDefinition extends ExtendedImplementingTypeDefinition { +/** + * Extended definition of GraphQL interface type: based definition + its extensions + */ +public class ExtendedInterfaceTypeDefinition + extends ExtendedImplementingTypeDefinition { + /** + * Get fields with extended information of the given interface + * + * @return List of field definitions + */ public List getFieldDefinitions() { List definitions = new ArrayList<>(); if (definition != null) { diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedObjectTypeDefinition.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedObjectTypeDefinition.java index 735e3f52f..81d5af051 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedObjectTypeDefinition.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedObjectTypeDefinition.java @@ -12,7 +12,11 @@ import java.util.Map; import java.util.function.Function; -public class ExtendedObjectTypeDefinition extends ExtendedImplementingTypeDefinition { +/** + * Extended definition of GraphQL object type: based definition + its extensions + */ +public class ExtendedObjectTypeDefinition + extends ExtendedImplementingTypeDefinition { /** * Get source location of the node. @@ -24,6 +28,11 @@ private static String getSourceLocationName(Node node) { return node.getSourceLocation() != null ? node.getSourceLocation().getSourceName() : "unknown"; } + /** + * Get fields with extended information of the given object + * + * @return List of field definitions + */ public List getFieldDefinitions() { List definitions = new ArrayList<>(); if (definition != null) { diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedScalarTypeDefinition.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedScalarTypeDefinition.java index 9ae6395ef..acf380961 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedScalarTypeDefinition.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedScalarTypeDefinition.java @@ -3,6 +3,10 @@ import graphql.language.ScalarTypeDefinition; import graphql.language.ScalarTypeExtensionDefinition; -public class ExtendedScalarTypeDefinition extends ExtendedDefinition { +/** + * Extended definition of GraphQL scalar type: based definition + its extensions + */ +public class ExtendedScalarTypeDefinition + extends ExtendedDefinition { } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedUnionTypeDefinition.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedUnionTypeDefinition.java index e49f3c084..dd521955f 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedUnionTypeDefinition.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/definitions/ExtendedUnionTypeDefinition.java @@ -8,6 +8,9 @@ import java.util.HashSet; import java.util.Set; +/** + * Extended definition of GraphQL union type: based definition + its extensions + */ public class ExtendedUnionTypeDefinition extends ExtendedDefinition { private Set memberTypeNames; @@ -16,7 +19,8 @@ public class ExtendedUnionTypeDefinition extends ExtendedDefinitiontrue if definition is a part of union. falseif definition is a part of union. + * @return true if definition is a part of union. falseif + * definition is a part of union. */ public boolean isDefinitionPartOfUnion(ExtendedDefinition definition) { return getMemberTypeNames().contains(definition.getName()); diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/exception/LanguageNotSupportedException.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/exception/LanguageNotSupportedException.java index 063a6220c..d93ecc19a 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/exception/LanguageNotSupportedException.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/exception/LanguageNotSupportedException.java @@ -2,6 +2,9 @@ import com.kobylynskyi.graphql.codegen.model.GeneratedLanguage; +/** + * Eception is thrown when specified language is not supportted by GraphQL Code generator + */ public class LanguageNotSupportedException extends IllegalArgumentException { public LanguageNotSupportedException(GeneratedLanguage generatedLanguage) { diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLError.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLError.java index 016ec25db..30c6dfb0c 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLError.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLError.java @@ -4,6 +4,9 @@ import java.util.Map; import java.util.Objects; +/** + * A class describing GraphQL error + */ public class GraphQLError { private String message; @@ -66,8 +69,12 @@ public void setExtensions(Map extensions) { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } GraphQLError that = (GraphQLError) o; return Objects.equals(message, that.message) && Objects.equals(locations, that.locations) && diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLErrorSourceLocation.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLErrorSourceLocation.java index 6f0c77316..05d9c89d5 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLErrorSourceLocation.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLErrorSourceLocation.java @@ -2,6 +2,9 @@ import java.util.Objects; +/** + * Source location of GraphQL error in the schema + */ public class GraphQLErrorSourceLocation { private int line; @@ -43,8 +46,12 @@ public void setSourceName(String sourceName) { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } GraphQLErrorSourceLocation that = (GraphQLErrorSourceLocation) o; return line == that.line && column == that.column && diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLErrorType.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLErrorType.java index eccf6a31c..999478b06 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLErrorType.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLErrorType.java @@ -1,6 +1,10 @@ package com.kobylynskyi.graphql.codegen.model.graphql; -@SuppressWarnings({"java:S115"}) // comes from graphql-java library +/** + * Possible types of GraphQL errors + * Copied from graphql-java library + */ +@SuppressWarnings({"java:S115"}) public enum GraphQLErrorType { InvalidSyntax, ValidationError, diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLOperation.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLOperation.java index d3d90890c..b03bc82f6 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLOperation.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLOperation.java @@ -1,7 +1,12 @@ package com.kobylynskyi.graphql.codegen.model.graphql; +/** + * GraphQL operations + */ public enum GraphQLOperation { - QUERY, MUTATION, SUBSCRIPTION + QUERY, + MUTATION, + SUBSCRIPTION } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLOperationRequest.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLOperationRequest.java index 80ea5ffd1..4a2a72830 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLOperationRequest.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLOperationRequest.java @@ -43,12 +43,12 @@ public interface GraphQLOperationRequest { /** * Fields that require serialization using * {@link com.fasterxml.jackson.databind.ObjectMapper#writeValueAsString(Object)} - *

          - * Values should be defined here in format: GraphqlObjectName.fieldName or GraphqlTypeName - *

          - * If just type is specified, then all fields of this type will be serialized using ObjectMapper. - *

          - * E.g.: + * + *

          Values should be defined here in format: GraphqlObjectName.fieldName or GraphqlTypeName + * + *

          If just type is specified, then all fields of this type will be serialized using ObjectMapper. + * + *

          E.g.: *

            *
          • {@code Person.createdDateTime}
          • *
          • {@code ZonedDateTime}
          • diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLRequestSerializer.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLRequestSerializer.java index 275cace1a..151517a7a 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLRequestSerializer.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLRequestSerializer.java @@ -12,6 +12,10 @@ import java.util.Set; import java.util.StringJoiner; +/** + * Serializer of GraphQL request. + * Provides ability to convert GraphQLRequest object to HTTP Json body, as well as to raw query string. + */ public class GraphQLRequestSerializer { public static final ObjectMapper OBJECT_MAPPER = Utils.OBJECT_MAPPER; @@ -37,7 +41,8 @@ public static String toHttpJsonBody(GraphQLRequests graphQLRequests) { throw new IllegalArgumentException("Null GraphQL request was supplied"); } if (operation != null && operation != request.getRequest().getOperationType()) { - throw new IllegalArgumentException("Only operations of the same type (query/mutation/subscription) can be executed at once"); + throw new IllegalArgumentException( + "Only operations of the same type (query/mutation/subscription) can be executed at once"); } queryBuilder.append(buildQuery(request)).append(" "); } @@ -130,6 +135,14 @@ public static String getEntry(Object input) { return getEntry(input, false); } + /** + * Serialize object to a string + * + * @param input can be any object or collection of objects. + * @param useObjectMapper if true, then use Jackson's ObjectMapper to convert from object to string, + * otherwise use toString + * @return serialized object + */ @SuppressWarnings("java:S1872") public static String getEntry(Object input, boolean useObjectMapper) { if (input == null) { diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLResponse.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLResponse.java index 4fbde6e3d..5fa4f064f 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLResponse.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLResponse.java @@ -2,6 +2,9 @@ import java.util.Map; +/** + * Generic class having content of GraphQL response + */ public class GraphQLResponse extends GraphQLResult> { public GraphQLResponse() { diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLResponseProjection.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLResponseProjection.java index a823a8b26..7ee5f530b 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLResponseProjection.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLResponseProjection.java @@ -29,13 +29,20 @@ public abstract class GraphQLResponseProjection { * } * }} * Map Notes: - * `key` is parentProjection.childProjection.currentMethod. e.g. `CharacterResponseProjection.CharacterResponseProjection.friends` (excluding the first layer, so if only want the first child layer, use `all$(1)`) - * `value` is current depth for Character type. Each projection has a new instance of `projectionDepthOnFields`, so it always be `1` or `0`. + * `key` is parentProjection.childProjection.currentMethod. e.g. `CharacterResponseProjection + * .CharacterResponseProjection.friends` (excluding the first layer, so if only want the first child layer, use + * `all$(1)`) + * `value` is current depth for Character type. Each projection has a new instance of `projectionDepthOnFields`, + * so it always be `1` or `0`. * and `responseProjectionMaxDepth` will reduce by recursive. */ protected final Map projectionDepthOnFields = new HashMap<>(); - //Defined at the parent level to use dynamic calls, default null. + /** + * Defined at the parent level to use dynamic calls, default null. + * + * @return projection of all fields that are present in the given type + */ public abstract GraphQLResponseProjection all$(); public abstract GraphQLResponseProjection all$(int maxDepth); diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/UnableToBuildJsonQueryException.java b/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/UnableToBuildJsonQueryException.java index a181e6ec3..7295bca9b 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/UnableToBuildJsonQueryException.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/model/graphql/UnableToBuildJsonQueryException.java @@ -1,5 +1,8 @@ package com.kobylynskyi.graphql.codegen.model.graphql; +/** + * Exception is thrown when it is unable to serialize GraphQL request to a string + */ public class UnableToBuildJsonQueryException extends IllegalArgumentException { public UnableToBuildJsonQueryException(Exception e) { diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaDataModelMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaDataModelMapper.java index 2fef593ca..4fead00b8 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaDataModelMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaDataModelMapper.java @@ -10,6 +10,9 @@ import static com.kobylynskyi.graphql.codegen.utils.Utils.wrapString; +/** + * Data model mapper for SCALA generated classes + */ public class ScalaDataModelMapper implements DataModelMapper { private static final String RESTRICTED_WORDS_WRAP_WITH = "`"; diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaGraphQLCodegen.java b/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaGraphQLCodegen.java index ad0680d4b..7cb87241b 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaGraphQLCodegen.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaGraphQLCodegen.java @@ -12,24 +12,34 @@ import java.util.Collection; import java.util.List; +/** + * Class having only Scala-specific methods for code-generation + * Most of the logic is still residing in the parent class + */ public class ScalaGraphQLCodegen extends GraphQLCodegen { private static final MapperFactory MAPPER_FACTORY = new ScalaMapperFactoryImpl(); - public ScalaGraphQLCodegen(List schemas, File outputDir, MappingConfig mappingConfig, GeneratedInformation generatedInformation) { + public ScalaGraphQLCodegen(List schemas, File outputDir, MappingConfig mappingConfig, + GeneratedInformation generatedInformation) { super(schemas, outputDir, mappingConfig, generatedInformation, MAPPER_FACTORY); } - public ScalaGraphQLCodegen(String introspectionResult, File outputDir, MappingConfig mappingConfig, GeneratedInformation generatedInformation) { + public ScalaGraphQLCodegen(String introspectionResult, File outputDir, MappingConfig mappingConfig, + GeneratedInformation generatedInformation) { super(introspectionResult, outputDir, mappingConfig, generatedInformation, MAPPER_FACTORY); } - public ScalaGraphQLCodegen(List schemas, String introspectionResult, File outputDir, MappingConfig mappingConfig, MappingConfigSupplier externalMappingConfigSupplier) { + public ScalaGraphQLCodegen(List schemas, String introspectionResult, File outputDir, + MappingConfig mappingConfig, MappingConfigSupplier externalMappingConfigSupplier) { super(schemas, introspectionResult, outputDir, mappingConfig, externalMappingConfigSupplier, MAPPER_FACTORY); } - public ScalaGraphQLCodegen(List schemas, String introspectionResult, File outputDir, MappingConfig mappingConfig, MappingConfigSupplier externalMappingConfigSupplier, GeneratedInformation generatedInformation) { - super(schemas, introspectionResult, outputDir, mappingConfig, externalMappingConfigSupplier, generatedInformation, MAPPER_FACTORY); + public ScalaGraphQLCodegen(List schemas, String introspectionResult, File outputDir, + MappingConfig mappingConfig, MappingConfigSupplier externalMappingConfigSupplier, + GeneratedInformation generatedInformation) { + super(schemas, introspectionResult, outputDir, mappingConfig, externalMappingConfigSupplier, + generatedInformation, MAPPER_FACTORY); } @Override @@ -54,11 +64,13 @@ protected void initCustomTypeMappings(Collection s super.initCustomTypeMappings(scalarTypeDefinitions); mappingConfig.putCustomTypeMappingIfAbsent("ID", String.class.getSimpleName()); mappingConfig.putCustomTypeMappingIfAbsent("String", String.class.getSimpleName()); - mappingConfig.putCustomTypeMappingIfAbsent("Int", "Option[Int]"); + mappingConfig.putCustomTypeMappingIfAbsent("Int", "scala.Option[Int]"); mappingConfig.putCustomTypeMappingIfAbsent("Int!", "Int"); - mappingConfig.putCustomTypeMappingIfAbsent("Float", Utils.wrapString(Double.class.getSimpleName(), "Option[", "]")); + mappingConfig.putCustomTypeMappingIfAbsent("Float", + Utils.wrapString(Double.class.getSimpleName(), "scala.Option[", "]")); mappingConfig.putCustomTypeMappingIfAbsent("Float!", Double.class.getSimpleName()); - mappingConfig.putCustomTypeMappingIfAbsent("Boolean", Utils.wrapString(Boolean.class.getSimpleName(), "Option[", "]")); + mappingConfig.putCustomTypeMappingIfAbsent("Boolean", + Utils.wrapString(Boolean.class.getSimpleName(), "scala.Option[", "]")); mappingConfig.putCustomTypeMappingIfAbsent("Boolean!", Boolean.class.getSimpleName()); } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaGraphQLTypeMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaGraphQLTypeMapper.java index fddc86f05..170282395 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaGraphQLTypeMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaGraphQLTypeMapper.java @@ -13,10 +13,13 @@ import static com.kobylynskyi.graphql.codegen.java.JavaGraphQLTypeMapper.JAVA_UTIL_LIST; import static java.util.Arrays.asList; +/** + * Mapper class for converting GraphQL types to Scala types + */ public class ScalaGraphQLTypeMapper implements GraphQLTypeMapper { - private static final String SCALA_UTIL_LIST = "Seq"; - private static final String SCALA_UTIL_OPTIONAL = "Option"; + private static final String SCALA_UTIL_LIST = "scala.Seq"; + private static final String SCALA_UTIL_OPTIONAL = "scala.Option"; private static final Set SCALA_PRIMITIVE_TYPES = new HashSet<>(asList( "Byte", "Short", "Int", "Long", "Float", "Double", "Char", "Boolean")); @@ -38,6 +41,10 @@ public static boolean isScalaCollection(String scalaType) { return scalaType.startsWith(SCALA_UTIL_LIST + "[") && scalaType.endsWith("]"); } + public static String getGenericParameter(String scalaType) { + return scalaType.substring(SCALA_UTIL_LIST.length() + 1, scalaType.length() - 1); + } + @Override public String wrapIntoList(MappingContext mappingContext, String type, boolean mandatory) { return getGenericsString(mappingContext, SCALA_UTIL_LIST, type); @@ -63,7 +70,8 @@ public String wrapApiReturnTypeIfRequired(MappingContext mappingContext, && !namedDefinition.isMandatory() && !computedTypeName.startsWith(SCALA_UTIL_LIST) && !computedTypeName.startsWith(JAVA_UTIL_LIST) - && !computedTypeName.startsWith(SCALA_UTIL_OPTIONAL)) {// The primitive types is Option by default + && !computedTypeName.startsWith(SCALA_UTIL_OPTIONAL)) { + // Kotlin/Scala: primitive types is Option by default // wrap the type into scala.Option (except java list and scala list) computedTypeName = getGenericsString(mappingContext, SCALA_UTIL_OPTIONAL, computedTypeName); } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaMapperFactoryImpl.java b/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaMapperFactoryImpl.java index 619eb5392..ae79cb8e0 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaMapperFactoryImpl.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaMapperFactoryImpl.java @@ -6,6 +6,9 @@ import com.kobylynskyi.graphql.codegen.mapper.ValueFormatter; import com.kobylynskyi.graphql.codegen.mapper.ValueMapper; +/** + * A factory of various mappers for Scala language + */ public class ScalaMapperFactoryImpl implements MapperFactory { @Override diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaValueFormatter.java b/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaValueFormatter.java index 35743a0f4..09e7d6ff4 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaValueFormatter.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/scala/ScalaValueFormatter.java @@ -4,21 +4,24 @@ import java.util.StringJoiner; +/** + * Class contains various formatting logic that is specific only for Scala language + */ public class ScalaValueFormatter implements ValueFormatter { @Override public String getEmptyListValue() { - return "Seq.empty"; + return "scala.Seq.empty"; } @Override public StringJoiner getListJoiner() { - return new StringJoiner(", ", "Seq(", ")"); + return new StringJoiner(", ", "scala.Seq(", ")"); } @Override public StringJoiner getArrayJoiner() { - return new StringJoiner(", ", "Array(", ")"); + return new StringJoiner(", ", "scala.Array(", ")"); } } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/utils/Utils.java b/src/main/java/com/kobylynskyi/graphql/codegen/utils/Utils.java index b9d12fb19..f369876ea 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/utils/Utils.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/utils/Utils.java @@ -40,17 +40,23 @@ public static boolean isGraphqlOperation(String typeDef) { /** * Capitalize a string. Make first letter as capital * - * @param aString string to capitalize + * @param stringToCapitalize string to capitalize * @return capitalized string */ - public static String capitalize(String aString) { - char[] chars = aString.toCharArray(); + public static String capitalize(String stringToCapitalize) { + char[] chars = stringToCapitalize.toCharArray(); chars[0] = Character.toUpperCase(chars[0]); return new String(chars); } - public static String capitalizeString(String aString) { - char[] chars = aString.toLowerCase().toCharArray(); + /** + * Make a string as CamelCase + * + * @param stringToCamelCase string to convert to CamelCase + * @return CamelCasedString + */ + public static String camelCaseString(String stringToCamelCase) { + char[] chars = stringToCamelCase.toLowerCase().toCharArray(); boolean found = false; for (int i = 0; i < chars.length; i++) { if (!found && Character.isLetter(chars[i])) { @@ -64,13 +70,13 @@ public static String capitalizeString(String aString) { } /** - * Uncapitalize a string. Make first letter as lowercase + * Un-capitalize a string. Make first letter as lowercase * - * @param aString string to uncapitalize + * @param stringToUncapitalize string to un-capitalize * @return uncapitalized string */ - public static String uncapitalize(String aString) { - char[] chars = aString.toCharArray(); + public static String unCapitalize(String stringToUncapitalize) { + char[] chars = stringToUncapitalize.toCharArray(); chars[0] = Character.toLowerCase(chars[0]); return new String(chars); } @@ -208,8 +214,8 @@ public static String replaceLeadingAtSign(String value) { /** * Copy of org.apache.commons.lang3.StringUtils#substringBetween(String, String, String) - *

            - * Gets the String that is nested in between two Strings. + * + *

            Gets the String that is nested in between two Strings. * Only the first match is returned. * * @param str the String containing the substring, may be null diff --git a/src/main/resources/templates/scala-lang/scalaClassGraphqlInterface.ftl b/src/main/resources/templates/scala-lang/scalaClassGraphqlInterface.ftl index 84195d17f..c1b22b864 100644 --- a/src/main/resources/templates/scala-lang/scalaClassGraphqlInterface.ftl +++ b/src/main/resources/templates/scala-lang/scalaClassGraphqlInterface.ftl @@ -1,3 +1,4 @@ +<#assign MapperUtil=statics["com.kobylynskyi.graphql.codegen.scala.ScalaGraphQLTypeMapper"]> <#if package?has_content> package ${package} @@ -11,8 +12,8 @@ import ${import}._ <#if enumImportItSelfInScala?has_content> <#list fields as field> <#list enumImportItSelfInScala as enum> - <#if field.type?contains("Seq[")> - <#if enum == field.type?replace("Seq[", "")?replace("]", "")> + <#if MapperUtil.isScalaCollection(field.type)> + <#if enum == MapperUtil.getGenericParameter(field.type)> import ${enum}._ <#else > diff --git a/src/main/resources/templates/scala-lang/scalaClassGraphqlOperations.ftl b/src/main/resources/templates/scala-lang/scalaClassGraphqlOperations.ftl index 882ec46fe..680034821 100644 --- a/src/main/resources/templates/scala-lang/scalaClassGraphqlOperations.ftl +++ b/src/main/resources/templates/scala-lang/scalaClassGraphqlOperations.ftl @@ -13,7 +13,7 @@ import ${import}._ <#list operation.parameters as param> <#list enumImportItSelfInScala as enum> <#if MapperUtil.isScalaCollection(param.type)> - <#if enum == param.type?replace("Seq[", "")?replace("]", "")> + <#if enum == MapperUtil.getGenericParameter(param.type)> <#if !waitImports?seq_contains(enum)> <#assign waitImports = waitImports + [enum] /> diff --git a/src/main/resources/templates/scala-lang/scalaClassGraphqlParametrizedInput.ftl b/src/main/resources/templates/scala-lang/scalaClassGraphqlParametrizedInput.ftl index 4b1106cb4..b18ad99a6 100644 --- a/src/main/resources/templates/scala-lang/scalaClassGraphqlParametrizedInput.ftl +++ b/src/main/resources/templates/scala-lang/scalaClassGraphqlParametrizedInput.ftl @@ -11,7 +11,7 @@ import scala.collection.JavaConverters._ <#list fields as field> <#list enumImportItSelfInScala as enum> <#if MapperUtil.isScalaCollection(field.type)> - <#if enum == field.type?replace("Seq[", "")?replace("]", "")> + <#if enum == MapperUtil.getGenericParameter(field.type)> import ${enum}._ <#else > @@ -54,9 +54,9 @@ case class ${className}( ) extends GraphQLParametrizedInput { - override def toString(): String = {<#--There is no Option[Seq[T]]--> + override def toString(): String = {<#--There is no Option[Seq[T]], Format is not supported in the generated code, so it is very difficult to write template for this format.--> <#if fields?has_content> - Seq(<#list fields as field><#assign getMethod = ".get"><#assign asJava = ".asJava"> + scala.Seq(<#list fields as field><#assign getMethod = ".get"><#assign asJava = ".asJava"> <#if MapperUtil.isScalaPrimitive(field.type)>"${field.originalName}: " + GraphQLRequestSerializer.getEntry(${field.name})<#if field_has_next>,<#elseif MapperUtil.isScalaOption(field.type)>if (${field.name}.isDefined) "${field.originalName}: " + GraphQLRequestSerializer.getEntry(${field.name}${getMethod}) else ""<#if field_has_next>,<#else>if (${field.name} != null)<#if MapperUtil.isScalaCollection(field.type)> "${field.originalName}: " + GraphQLRequestSerializer.getEntry(${field.name}${asJava}) else ""<#if field_has_next>,<#else> "${field.originalName}: " + GraphQLRequestSerializer.getEntry(${field.name}) else ""<#if field_has_next>, ).filter(_ != "").mkString("(", ",", ")") <#else> diff --git a/src/main/resources/templates/scala-lang/scalaClassGraphqlRequest.ftl b/src/main/resources/templates/scala-lang/scalaClassGraphqlRequest.ftl index 2308be2e8..3e3bc2568 100644 --- a/src/main/resources/templates/scala-lang/scalaClassGraphqlRequest.ftl +++ b/src/main/resources/templates/scala-lang/scalaClassGraphqlRequest.ftl @@ -6,7 +6,7 @@ package ${package} import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLOperation import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLOperationRequest import java.util.{ LinkedHashMap => JLinkedHashMap } -import java.util.{ Map => JMap } +import java.util.{ Map => JMap, Set => JSet } <#if toString || equalsAndHashCode> import java.util.Objects @@ -17,7 +17,7 @@ import scala.collection.JavaConverters._ <#list fields as field> <#list enumImportItSelfInScala as enum> <#if MapperUtil.isScalaCollection(field.type)> - <#if enum == field.type?replace("Seq[", "")?replace("]", "")> + <#if enum == MapperUtil.getGenericParameter(field.type)> import ${enum}._ <#else > @@ -85,7 +85,7 @@ class ${className}(alias: String) extends GraphQLOperationRequest { override def getInput(): JMap[String, java.lang.Object] = input - override def getUseObjectMapperForInputSerialization(): java.util.Set[String] = useObjectMapperForInputSerialization.asJava + override def getUseObjectMapperForInputSerialization(): JSet[String] = useObjectMapperForInputSerialization.asJava <#if equalsAndHashCode> override def equals(obj: Any): Boolean = { diff --git a/src/main/resources/templates/scala-lang/scalaClassGraphqlType.ftl b/src/main/resources/templates/scala-lang/scalaClassGraphqlType.ftl index c2354ea9f..5af61b29a 100644 --- a/src/main/resources/templates/scala-lang/scalaClassGraphqlType.ftl +++ b/src/main/resources/templates/scala-lang/scalaClassGraphqlType.ftl @@ -20,7 +20,7 @@ import scala.collection.JavaConverters._ <#list fields as field> <#list enumImportItSelfInScala as enum> <#if MapperUtil.isScalaCollection(field.type)> - <#if enum == field.type?replace("Seq[", "")?replace("]", "")> + <#if enum == MapperUtil.getGenericParameter(field.type)> import ${enum}._ <#else > @@ -88,7 +88,7 @@ import ${enum}._ <#if toString> override def toString(): String = { <#if fields?has_content><#-- When you modify it, copy it out and make sure it is one line after modification, There is no Option[Seq[T]]. --> - Seq(<#list fields as field><#assign getMethod = ""><#assign asJava = ""><#if MapperUtil.isScalaOption(field.type)><#assign getMethod = ".get"><#if MapperUtil.isScalaCollection(field.type)><#assign asJava = ".asJava"> + scala.Seq(<#list fields as field><#assign getMethod = ""><#assign asJava = ""><#if MapperUtil.isScalaOption(field.type)><#assign getMethod = ".get"><#if MapperUtil.isScalaCollection(field.type)><#assign asJava = ".asJava"> <#if MapperUtil.isScalaPrimitive(field.type)><#if toStringForRequest>"${field.originalName}: " + GraphQLRequestSerializer.getEntry(${field.name}<#if field.serializeUsingObjectMapper>, true)<#else>"${field.originalName}: " + ${field.name}<#else><#if MapperUtil.isScalaOption(field.type)>if (${field.name}.isDefined) <#else>if (${field.name} != null) <#if toStringForRequest>"${field.originalName}: " + GraphQLRequestSerializer.getEntry(${field.name}${getMethod}${asJava}<#if field.serializeUsingObjectMapper>, true)<#else><#if field.type == "String"> "${field.originalName}: \"${field.name}\"" <#else> "${field.originalName}: ${field.name}" else ""<#if field_has_next>, ).filter(_ != "").mkString("{", ",", "}") <#else><#--Keep it on one line to make sure the code style remains the same--> diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenAnnotationsTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenAnnotationsTest.java index 07e5ba48c..0e916b6e5 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenAnnotationsTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenAnnotationsTest.java @@ -41,16 +41,19 @@ void cleanup() { @Test void generate_CustomAnnotationMappings() throws Exception { - mappingConfig.setCustomTypesMapping(new HashMap<>(singletonMap("Event.createdDateTime", "org.joda.time.DateTime"))); + mappingConfig.setCustomTypesMapping(new HashMap<>( + singletonMap("Event.createdDateTime", "org.joda.time.DateTime"))); mappingConfig.setCustomAnnotationsMapping(new HashMap<>(singletonMap("Event.createdDateTime", - singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = com.example.json.DateTimeScalarDeserializer.class)")))); + singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + + "using = com.example.json.DateTimeScalarDeserializer.class)")))); new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/test.graphqls"), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertFileContainsElements(files, "Event.java", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = com.example.json.DateTimeScalarDeserializer.class)" + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + + "using = com.example.json.DateTimeScalarDeserializer.class)" + System.lineSeparator() + " private org.joda.time.DateTime createdDateTime;"); } @@ -58,14 +61,16 @@ void generate_CustomAnnotationMappings() throws Exception { void generate_CustomAnnotationMappings_Type() throws Exception { mappingConfig.setCustomTypesMapping(new HashMap<>(singletonMap("DateTime", "org.joda.time.DateTime"))); mappingConfig.setCustomAnnotationsMapping(new HashMap<>(singletonMap("DateTime", - singletonList("com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = com.example.json.DateTimeScalarDeserializer.class)")))); + singletonList("com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + + "using = com.example.json.DateTimeScalarDeserializer.class)")))); new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/test.graphqls"), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertFileContainsElements(files, "Event.java", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = com.example.json.DateTimeScalarDeserializer.class)" + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + + "using = com.example.json.DateTimeScalarDeserializer.class)" + System.lineSeparator() + " private org.joda.time.DateTime createdDateTime;"); } @@ -73,14 +78,16 @@ void generate_CustomAnnotationMappings_Type() throws Exception { void generate_CustomAnnotationMappings_FieldType() throws Exception { mappingConfig.setCustomTypesMapping(new HashMap<>(singletonMap("DateTime", "org.joda.time.DateTime"))); mappingConfig.setCustomAnnotationsMapping(new HashMap<>(singletonMap("Event.createdDateTime", - singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = com.example.json.DateTimeScalarDeserializer.class)")))); + singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + + "using = com.example.json.DateTimeScalarDeserializer.class)")))); new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/test.graphqls"), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertFileContainsElements(files, "Event.java", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = com.example.json.DateTimeScalarDeserializer.class)" + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + + "using = com.example.json.DateTimeScalarDeserializer.class)" + System.lineSeparator() + " private org.joda.time.DateTime createdDateTime;"); } @@ -88,15 +95,25 @@ void generate_CustomAnnotationMappings_FieldType() throws Exception { void generate_CustomAnnotationMappings_Class() throws Exception { Map> customAnnotationsMapping = new HashMap<>(); // input - customAnnotationsMapping.put("AcceptTopicSuggestionInput", singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = AcceptTopicSuggestionInputDeserializer.class)")); + customAnnotationsMapping.put("AcceptTopicSuggestionInput", + singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + + "using = AcceptTopicSuggestionInputDeserializer.class)")); // type - customAnnotationsMapping.put("AcceptTopicSuggestionPayload", singletonList("com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = AcceptTopicSuggestionPayloadDeserializer.class)")); + customAnnotationsMapping.put("AcceptTopicSuggestionPayload", + singletonList("com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + + "using = AcceptTopicSuggestionPayloadDeserializer.class)")); // interface - customAnnotationsMapping.put("Actor", singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = ActorDeserializer.class)")); + customAnnotationsMapping.put("Actor", + singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + + "using = ActorDeserializer.class)")); // union - customAnnotationsMapping.put("Assignee", singletonList("com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = AssigneeDeserializer.class)")); + customAnnotationsMapping.put("Assignee", + singletonList("com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + + "using = AssigneeDeserializer.class)")); // enum - customAnnotationsMapping.put("DeploymentOrderField", singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = DeploymentOrderFieldDeserializer.class)")); + customAnnotationsMapping.put("DeploymentOrderField", + singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + + "using = DeploymentOrderFieldDeserializer.class)")); mappingConfig.setCustomAnnotationsMapping(customAnnotationsMapping); new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), @@ -104,19 +121,24 @@ void generate_CustomAnnotationMappings_Class() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertFileContainsElements(files, "AcceptTopicSuggestionInput.java", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = AcceptTopicSuggestionInputDeserializer.class)" + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + + "using = AcceptTopicSuggestionInputDeserializer.class)" + System.lineSeparator() + "public class AcceptTopicSuggestionInput "); assertFileContainsElements(files, "AcceptTopicSuggestionPayload.java", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = AcceptTopicSuggestionPayloadDeserializer.class)" + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + + "using = AcceptTopicSuggestionPayloadDeserializer.class)" + System.lineSeparator() + "public class AcceptTopicSuggestionPayload "); assertFileContainsElements(files, "Actor.java", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = ActorDeserializer.class)" + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + + "using = ActorDeserializer.class)" + System.lineSeparator() + "public interface Actor "); assertFileContainsElements(files, "Assignee.java", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = AssigneeDeserializer.class)" + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + + "using = AssigneeDeserializer.class)" + System.lineSeparator() + "public interface Assignee "); assertFileContainsElements(files, "DeploymentOrderField.java", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = DeploymentOrderFieldDeserializer.class)" + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + + "using = DeploymentOrderFieldDeserializer.class)" + System.lineSeparator() + "public enum DeploymentOrderField "); } @@ -125,8 +147,11 @@ void generate_CustomAnnotationMappings_Multiple() throws Exception { Map> customAnnotationsMapping = new HashMap<>(); // type customAnnotationsMapping.put("AcceptTopicSuggestionPayload", Arrays.asList( - "@com.fasterxml.jackson.annotation.JsonTypeInfo(use = com.fasterxml.jackson.annotation.JsonTypeInfo.Id.NAME, property = \"__typename\")", - "@com.fasterxml.jackson.databind.annotation.JsonTypeIdResolver(io.github.kobylynskyi.order.external.starwars.AcceptTopicSuggestionPayloadTypeResolver.class)")); + "@com.fasterxml.jackson.annotation.JsonTypeInfo(use = " + + "com.fasterxml.jackson.annotation.JsonTypeInfo.Id.NAME, property = \"__typename\")", + "@com.fasterxml.jackson.databind.annotation.JsonTypeIdResolver(" + + "io.github.kobylynskyi.order.external.starwars." + + "AcceptTopicSuggestionPayloadTypeResolver.class)")); mappingConfig.setCustomAnnotationsMapping(customAnnotationsMapping); new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), @@ -134,9 +159,11 @@ void generate_CustomAnnotationMappings_Multiple() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertFileContainsElements(files, "AcceptTopicSuggestionPayload.java", System.lineSeparator() + - "@com.fasterxml.jackson.annotation.JsonTypeInfo(use = com.fasterxml.jackson.annotation.JsonTypeInfo.Id.NAME, property = \"__typename\")" + "@com.fasterxml.jackson.annotation.JsonTypeInfo(" + + "use = com.fasterxml.jackson.annotation.JsonTypeInfo.Id.NAME, property = \"__typename\")" + System.lineSeparator() + - "@com.fasterxml.jackson.databind.annotation.JsonTypeIdResolver(io.github.kobylynskyi.order.external.starwars.AcceptTopicSuggestionPayloadTypeResolver.class)" + "@com.fasterxml.jackson.databind.annotation.JsonTypeIdResolver(" + + "io.github.kobylynskyi.order.external.starwars.AcceptTopicSuggestionPayloadTypeResolver.class)" + System.lineSeparator() + "public class AcceptTopicSuggestionPayload "); } @@ -145,9 +172,13 @@ void generate_CustomAnnotationMappings_Multiple() throws Exception { void generate_CustomAnnotationMappings_RequestResponseClasses() throws Exception { Map> customAnnotationsMapping = new HashMap<>(); // request - customAnnotationsMapping.put("CodeOfConductQueryRequest", singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = CodeOfConductQueryRequestDeserializer.class)")); + customAnnotationsMapping.put("CodeOfConductQueryRequest", + singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + + "using = CodeOfConductQueryRequestDeserializer.class)")); // response - customAnnotationsMapping.put("CodeOfConductQueryResponse", singletonList("com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = CodeOfConductQueryResponseDeserializer.class)")); + customAnnotationsMapping.put("CodeOfConductQueryResponse", + singletonList("com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + + "using = CodeOfConductQueryResponseDeserializer.class)")); mappingConfig.setCustomAnnotationsMapping(customAnnotationsMapping); mappingConfig.setGenerateClient(true); @@ -156,18 +187,27 @@ void generate_CustomAnnotationMappings_RequestResponseClasses() throws Exception File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertFileContainsElements(files, "CodeOfConductQueryRequest.java", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = CodeOfConductQueryRequestDeserializer.class)" - + System.lineSeparator() + "public class CodeOfConductQueryRequest implements GraphQLOperationRequest {"); + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + + "using = CodeOfConductQueryRequestDeserializer.class)" + + System.lineSeparator() + + "public class CodeOfConductQueryRequest implements GraphQLOperationRequest {"); assertFileContainsElements(files, "CodeOfConductQueryResponse.java", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = CodeOfConductQueryResponseDeserializer.class)" - + System.lineSeparator() + "public class CodeOfConductQueryResponse extends GraphQLResult> {"); + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + + "using = CodeOfConductQueryResponseDeserializer.class)" + + System.lineSeparator() + + "public class CodeOfConductQueryResponse extends GraphQLResult> {"); } @Test void generate_Directives() throws Exception { Map> directiveAnnotationsMapping = new HashMap<>(); directiveAnnotationsMapping.put("auth", - singletonList("@com.example.CustomAnnotation(roles={{roles?toArray}}, boo={{boo?toArray}}, float={{float?toArrayOfStrings}}, int={{int}}, n={{n?toString}})")); + singletonList("@com.example.CustomAnnotation(" + + "roles={{roles?toArray}}, " + + "boo={{boo?toArray}}, " + + "float={{float?toArrayOfStrings}}, " + + "int={{int}}, " + + "n={{n?toString}})")); mappingConfig.setDirectiveAnnotationsMapping(directiveAnnotationsMapping); new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/test.graphqls"), diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenApisTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenApisTest.java index 78c5b080d..371ffe5f4 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenApisTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenApisTest.java @@ -44,7 +44,8 @@ void cleanup() { void generate_FileNameAsPrefix() throws Exception { schemaFinder.setIncludePattern("sub-schema.*\\.graphqls"); mappingConfig.setApiNamePrefixStrategy(ApiNamePrefixStrategy.FILE_NAME_AS_PREFIX); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()) + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()) .generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -57,7 +58,8 @@ void generate_FileNameAsPrefix() throws Exception { void generate_FolderNameAsPrefix() throws Exception { schemaFinder.setIncludePattern("sub-schema.*\\.graphqls"); mappingConfig.setApiNamePrefixStrategy(ApiNamePrefixStrategy.FOLDER_NAME_AS_PREFIX); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()) + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()) .generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -70,7 +72,8 @@ void generate_FolderNameAsPrefix() throws Exception { void generate_Constant() throws Exception { schemaFinder.setIncludePattern("sub-schema.*\\.graphqls"); mappingConfig.setApiNamePrefixStrategy(ApiNamePrefixStrategy.CONSTANT); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()) + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()) .generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -84,13 +87,15 @@ void generate_InterfacePerSchemaAndFolderNameAsPrefix() throws Exception { schemaFinder.setIncludePattern("sub-schema.*\\.graphqls"); mappingConfig.setApiNamePrefixStrategy(ApiNamePrefixStrategy.FOLDER_NAME_AS_PREFIX); mappingConfig.setApiRootInterfaceStrategy(ApiRootInterfaceStrategy.INTERFACE_PER_SCHEMA); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()) + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()) .generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); assertEquals(new HashSet<>(asList("SubProj1PingQueryResolver.java", "SubProj2PongQueryResolver.java", - "SubProj1QueryResolver.java", "SubProj2QueryResolver.java")), generatedFileNames); + "SubProj1QueryResolver.java", "SubProj2QueryResolver.java")), + generatedFileNames); } @Test @@ -98,13 +103,15 @@ void generate_InterfacePerSchemaAndFileNameAsPrefix() throws Exception { schemaFinder.setIncludePattern("sub-schema.*\\.graphqls"); mappingConfig.setApiNamePrefixStrategy(ApiNamePrefixStrategy.FILE_NAME_AS_PREFIX); mappingConfig.setApiRootInterfaceStrategy(ApiRootInterfaceStrategy.INTERFACE_PER_SCHEMA); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()) + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()) .generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); assertEquals(new HashSet<>(asList("SubSchema1PingQueryResolver.java", "SubSchema2PongQueryResolver.java", - "SubSchema1QueryResolver.java", "SubSchema2QueryResolver.java")), generatedFileNames); + "SubSchema1QueryResolver.java", "SubSchema2QueryResolver.java")), + generatedFileNames); } @Test @@ -115,7 +122,8 @@ void generate_InterfacePerSchemaAndConstantPrefix() throws IOException { GeneratedInformation generatedInformation = TestUtils.getStaticGeneratedInfo(); List schemas = schemaFinder.findSchemas(); Assertions.assertThrows(IllegalArgumentException.class, - () -> new JavaGraphQLCodegen(schemas, outputBuildDir, mappingConfig, generatedInformation)); + () -> new JavaGraphQLCodegen(schemas, outputBuildDir, mappingConfig, + generatedInformation)); } @Test @@ -123,7 +131,8 @@ void generate_DoNotGenerateApiInterfaceForOperations() throws IOException { schemaFinder.setIncludePattern("test.*\\.graphqls"); mappingConfig.setApiInterfaceStrategy(ApiInterfaceStrategy.DO_NOT_GENERATE); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()) + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()) .generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -138,7 +147,8 @@ void generate_DoNotGenerateRootApiInterfaces() throws IOException { schemaFinder.setIncludePattern("test.*\\.graphqls"); mappingConfig.setApiRootInterfaceStrategy(ApiRootInterfaceStrategy.DO_NOT_GENERATE); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()) + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()) .generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -154,16 +164,17 @@ void generate_WithoutThrowsException() throws IOException { schemaFinder.setIncludePattern("github.*\\.graphqls"); mappingConfig.setGenerateApisWithThrowsException(false); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()) + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()) .generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent( - new File("src/test/resources/expected-classes/apis/CodeOfConductQueryResolver_withoutThrowsException.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/apis/" + + "CodeOfConductQueryResolver_withoutThrowsException.java.txt"), getFileByName(files, "CodeOfConductQueryResolver.java")); - assertSameTrimmedContent( - new File("src/test/resources/expected-classes/apis/MutationResolver_withoutThrowsException.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/apis/" + + "MutationResolver_withoutThrowsException.java.txt"), getFileByName(files, "MutationResolver.java")); } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenDefaultsTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenDefaultsTest.java index 535838eee..d64c706ac 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenDefaultsTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenDefaultsTest.java @@ -14,6 +14,7 @@ import java.util.Objects; import static com.kobylynskyi.graphql.codegen.TestUtils.assertSameTrimmedContent; +import static java.util.Arrays.asList; import static java.util.Collections.singletonList; import static java.util.Collections.singletonMap; import static java.util.stream.Collectors.toList; @@ -43,7 +44,7 @@ void generate_CheckFiles() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); List generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList()); - assertEquals(Arrays.asList("InputWithDefaults.java", "MyEnum.java", "SomeObject.java"), generatedFileNames); + assertEquals(asList("InputWithDefaults.java", "MyEnum.java", "SomeObject.java"), generatedFileNames); for (File file : files) { assertSameTrimmedContent(new File(String.format("src/test/resources/expected-classes/defaults/%s.txt", @@ -61,7 +62,7 @@ void generate_CheckFiles_WithPrefixSuffix() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); List generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList()); - assertEquals(Arrays.asList("InputWithDefaultsTO.java", "MyEnumTO.java", "SomeObjectTO.java"), generatedFileNames); + assertEquals(asList("InputWithDefaultsTO.java", "MyEnumTO.java", "SomeObjectTO.java"), generatedFileNames); for (File file : files) { assertSameTrimmedContent(new File(String.format("src/test/resources/expected-classes/defaults/%s.txt", @@ -78,7 +79,7 @@ void generate_CheckFiles_OnLongDefault() throws Exception { outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); List generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList()); - assertEquals(Arrays.asList("InputWithDefaultsDTO.java", "MyEnumDTO.java", "SomeObjectDTO.java"), generatedFileNames); + assertEquals(asList("InputWithDefaultsDTO.java", "MyEnumDTO.java", "SomeObjectDTO.java"), generatedFileNames); for (File file : files) { assertSameTrimmedContent(new File(String.format("src/test/resources/expected-classes/defaults/%s.txt", diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenEmptyTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenEmptyTest.java index 4197047ad..02866ace9 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenEmptyTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenEmptyTest.java @@ -40,7 +40,8 @@ void cleanup() { @Test void generateServerSideClasses() throws Exception { - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); @@ -59,7 +60,8 @@ void generateServerSideClasses() throws Exception { void generateClientSideClasses() throws Exception { mappingConfig.setGenerateApis(false); mappingConfig.setGenerateClient(true); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenExtendTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenExtendTest.java index 35249188a..5a64dd72e 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenExtendTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenExtendTest.java @@ -40,7 +40,8 @@ void cleanup() { @Test void generateServerSideClasses() throws Exception { - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); @@ -60,18 +61,22 @@ void generateServerSideClasses() throws Exception { @Test void generate_onlyExtend() throws Exception { schemaFinder.setIncludePattern("only-extend-queries.*\\.graphqls"); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); assertEquals(new HashSet<>(asList("SubscriptionResolver.java", "UserQueryResolver.java", "User.java", - "UsersCreatedSubscriptionResolver.java", "CreateUserMutationResolver.java", "MutationResolver.java", "QueryResolver.java", - "UserInput.java")), Arrays.stream(Objects.requireNonNull(outputJavaClassesDir.listFiles())) - .map(File::getName).collect(toSet())); + "UsersCreatedSubscriptionResolver.java", "CreateUserMutationResolver.java", + "MutationResolver.java", "QueryResolver.java", + "UserInput.java")), + Arrays.stream(Objects.requireNonNull(outputJavaClassesDir.listFiles())) + .map(File::getName).collect(toSet())); } @Test void generateServerSideClasses_ExtensionFieldsResolvers() throws Exception { mappingConfig.setGenerateExtensionFieldsResolvers(true); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); @@ -84,7 +89,8 @@ void generateServerSideClasses_ExtensionFieldsResolvers() throws Exception { for (File file : files) { assertSameTrimmedContent( - new File(String.format("src/test/resources/expected-classes/extend-with-resolvers/%s.txt", file.getName())), + new File(String.format("src/test/resources/expected-classes/extend-with-resolvers/%s.txt", + file.getName())), file); } } @@ -93,7 +99,8 @@ void generateServerSideClasses_ExtensionFieldsResolvers() throws Exception { void generateServerSideClasses_ExtensionFieldsResolvers_WithExclusions() throws Exception { mappingConfig.setGenerateExtensionFieldsResolvers(true); mappingConfig.setFieldsWithoutResolvers(new HashSet<>(asList("Node", "Event.assets"))); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); @@ -114,7 +121,8 @@ void generateServerSideClasses_ExtensionFieldsResolvers_WithExclusions() throws void generateClientSideClasses() throws Exception { mappingConfig.setGenerateApis(false); mappingConfig.setGenerateClient(true); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -130,7 +138,8 @@ void generateClientSideClasses() throws Exception { @Test void generateServerSideClasses_EmptyTypes() throws Exception { schemaFinder.setIncludePattern("empty-types-with-extend\\.graphqls"); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenExternalConfigTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenExternalConfigTest.java index 0a75bc703..ad1ba9b77 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenExternalConfigTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenExternalConfigTest.java @@ -20,7 +20,8 @@ class GraphQLCodegenExternalConfigTest { */ @Test void check_mappingConfigFromJsonFile() { - MappingConfig externalMappingConfig = new JsonMappingConfigSupplier("src/test/resources/json/mappingconfig.json").get(); + MappingConfig externalMappingConfig = + new JsonMappingConfigSupplier("src/test/resources/json/mappingconfig.json").get(); assertEquals("com.kobylynskyi.graphql.testconfigjson", externalMappingConfig.getPackageName()); assertTrue(externalMappingConfig.getGenerateApis()); diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFieldsResolversTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFieldsResolversTest.java index 19f1bed6f..da58c0f1e 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFieldsResolversTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFieldsResolversTest.java @@ -38,7 +38,8 @@ void generate_ParametrizedFields() throws Exception { mappingConfig.setGenerateParameterizedFieldsResolvers(true); mappingConfig.setGenerateDataFetchingEnvironmentArgumentInApis(true); mappingConfig.setCustomAnnotationsMapping(new HashMap<>(singletonMap("Commit.blame", - singletonList("com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = com.example.json.DateTimeScalarDeserializer.class)")))); + singletonList("com.fasterxml.jackson.databind.annotation.JsonDeserialize(" + + "using = com.example.json.DateTimeScalarDeserializer.class)")))); new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); @@ -60,7 +61,8 @@ void generate_ParametrizedFieldsInInterface() throws Exception { outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/ProductLinkCodeParametrizedInput.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "ProductLinkCodeParametrizedInput.java.txt"), getFileByName(files, "ProductLinkCodeParametrizedInput.java")); } @@ -76,9 +78,11 @@ void generate_CustomFieldsResolvers() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/GithubAcceptTopicSuggestionPayloadTO.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/" + + "GithubAcceptTopicSuggestionPayloadTO.java.txt"), getFileByName(files, "GithubAcceptTopicSuggestionPayloadTO.java")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/AcceptTopicSuggestionPayloadResolver.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/" + + "AcceptTopicSuggestionPayloadResolver.java.txt"), getFileByName(files, "AcceptTopicSuggestionPayloadResolver.java")); } @@ -112,7 +116,8 @@ void generate_FieldResolversViaDirective() throws Exception { assertSameTrimmedContent(new File("src/test/resources/expected-classes/resolvers/Event.java.txt"), getFileByName(files, "Event.java")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/resolvers/EventPropertyResolver.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/resolvers/" + + "EventPropertyResolver.java.txt"), getFileByName(files, "EventPropertyResolver.java")); assertSameTrimmedContent(new File("src/test/resources/expected-classes/resolvers/EventProperty.java.txt"), getFileByName(files, "EventProperty.java")); diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFileCreatorTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFileCreatorTest.java index 0e96a1e23..0eccacd44 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFileCreatorTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFileCreatorTest.java @@ -36,8 +36,8 @@ void cleanup() { void generateFile() throws IOException { MappingConfig mappingConfig = new MappingConfig(); mappingConfig.setGeneratedLanguage(GeneratedLanguage.JAVA); - ExtendedDocument extendedDocument = GraphQLDocumentParser.getDocumentFromSchemas(mappingConfig, singletonList("src/test/resources/schemas/test.graphqls")); - MappingContext mappingContext = new MappingContext(mappingConfig, extendedDocument, new GeneratedInformation(), new DataModelMapperFactory(MAPPER_FACTORY)); + ExtendedDocument extendedDocument = GraphQLDocumentParser.getDocumentFromSchemas( + mappingConfig, singletonList("src/test/resources/schemas/test.graphqls")); Map dataModel = new HashMap<>(); dataModel.put(DataModelFields.CLASS_NAME, "Class1"); @@ -45,8 +45,12 @@ void generateFile() throws IOException { dataModel.put(DataModelFields.GENERATED_ANNOTATION, false); dataModel.put(DataModelFields.GENERATED_INFO, new GeneratedInformation()); + MappingContext mappingContext = new MappingContext(mappingConfig, extendedDocument, + new GeneratedInformation(), new DataModelMapperFactory(MAPPER_FACTORY)); + GraphQLCodegenFileCreator.generateFile(mappingContext, FreeMarkerTemplateType.ENUM, dataModel, OUTPUT_DIR); assertThrows(UnableToCreateFileException.class, - () -> GraphQLCodegenFileCreator.generateFile(mappingContext, FreeMarkerTemplateType.ENUM, dataModel, OUTPUT_DIR)); + () -> GraphQLCodegenFileCreator.generateFile( + mappingContext, FreeMarkerTemplateType.ENUM, dataModel, OUTPUT_DIR)); } } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenGitHubTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenGitHubTest.java index 6d97318b3..5e6a70437 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenGitHubTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenGitHubTest.java @@ -23,6 +23,10 @@ class GraphQLCodegenGitHubTest { private final File outputJavaClassesDir = new File("build/generated/com/github/graphql"); private final MappingConfig mappingConfig = new MappingConfig(); + private static String getFileContent(File[] files, String fileName) throws IOException { + return Utils.getFileContent(getFileByName(files, fileName).getPath()); + } + @BeforeEach void init() { mappingConfig.setGenerateParameterizedFieldsResolvers(false); @@ -101,9 +105,12 @@ void generate_Client_ConditionalFragments() throws Exception { outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/response/SearchResultItemConnectionResponseProjection.java.txt"), + assertSameTrimmedContent(new File( + "src/test/resources/expected-classes/response" + + "/SearchResultItemConnectionResponseProjection.java.txt"), getFileByName(files, "SearchResultItemConnectionResponseProjection.java")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/response/SearchResultItemResponseProjection.java.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/response/SearchResultItemResponseProjection.java.txt"), getFileByName(files, "SearchResultItemResponseProjection.java")); } @@ -122,8 +129,4 @@ void generate_NoPrimitives() throws Exception { getFileByName(files, "Commit.java")); } - private static String getFileContent(File[] files, String fileName) throws IOException { - return Utils.getFileContent(getFileByName(files, fileName).getPath()); - } - } \ No newline at end of file diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenInterfacesTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenInterfacesTest.java index eb99c4acf..eecd2afc5 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenInterfacesTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenInterfacesTest.java @@ -19,11 +19,10 @@ class GraphQLCodegenInterfacesTest { - private GraphQLCodegen generator; private final MappingConfig mappingConfig = new MappingConfig(); - private final File outputBuildDir = new File("build/generated"); private final File outputJavaClassesDir = new File("build/generated/com/kobylynskyi/graphql/interfaces"); + private GraphQLCodegen generator; @BeforeEach void init() { @@ -43,7 +42,8 @@ void generate_CheckFiles() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); List generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList()); - assertEquals(Arrays.asList("Bar.java", "Bar1.java", "BarBar.java", "Foo.java", "Foo1.java"), generatedFileNames); + assertEquals(Arrays.asList("Bar.java", "Bar1.java", "BarBar.java", "Foo.java", "Foo1.java"), + generatedFileNames); for (File file : files) { assertSameTrimmedContent(new File(String.format("src/test/resources/expected-classes/interfaces/%s.txt", diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenIntrospectionResultTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenIntrospectionResultTest.java index 93e109e2c..5872a05f6 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenIntrospectionResultTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenIntrospectionResultTest.java @@ -76,7 +76,8 @@ private void checkGeneratedFiles() throws IOException { "ProductsQueryResponse.java", "QueryResolver.java", "StockStatus.java"), generatedFileNames); for (File file : files) { - File expected = new File(String.format("src/test/resources/expected-classes/from-introspection-result/%s.txt", file.getName())); + File expected = new File(String.format( + "src/test/resources/expected-classes/from-introspection-result/%s.txt", file.getName())); assertSameTrimmedContent(expected, file); } } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenModelsForRootTypesTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenModelsForRootTypesTest.java index 6ced3f851..3f2f20f2b 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenModelsForRootTypesTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenModelsForRootTypesTest.java @@ -20,11 +20,11 @@ class GraphQLCodegenModelsForRootTypesTest { + public static final List SCHEMAS = singletonList("src/test/resources/schemas/test.graphqls"); private final MappingConfig mappingConfig = new MappingConfig(); private final GeneratedInformation staticGeneratedInfo = TestUtils.getStaticGeneratedInfo(); private final File outputBuildDir = new File("build/generated"); private final File outputJavaClassesDir = new File("build/generated/com/kobylynskyi/graphql/rootmodels"); - public static final List SCHEMAS = singletonList("src/test/resources/schemas/test.graphqls"); @BeforeEach void init() { @@ -59,8 +59,8 @@ void generate_sameResolverSuffixes() { () -> new JavaGraphQLCodegen(SCHEMAS, outputBuildDir, mappingConfig, staticGeneratedInfo), "Expected generate() to throw, but it didn't"); - assertEquals("Either disable APIs generation or set different Prefix/Suffix for API classes and type resolver classes", - thrown.getMessage()); + assertEquals("Either disable APIs generation or set different Prefix/Suffix for API classes and " + + "type resolver classes", thrown.getMessage()); } @Test diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenOptionalTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenOptionalTest.java index b8f80850f..7a24c7ca6 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenOptionalTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenOptionalTest.java @@ -35,8 +35,8 @@ void cleanup() { @Test void generate_Optional() throws Exception { schemaFinder.setIncludePattern("github.*\\.graphqls"); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()) - .generate(); + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -63,13 +63,14 @@ void generate_OptionalWithCustomApiReturnType() throws Exception { mappingConfig.setApiReturnType("reactor.core.publisher.Mono"); mappingConfig.setApiReturnListType("reactor.core.publisher.Flux"); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()) - .generate(); + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); // node(id: ID!): Node - assertSameTrimmedContent(new File("src/test/resources/expected-classes/optional/NodeQueryResolver_mono.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/optional/" + + "NodeQueryResolver_mono.java.txt"), getFileByName(files, "NodeQueryResolver.java")); } @@ -83,14 +84,16 @@ void generate_OptionalFieldInInterfaceAndMandatoryInType() throws Exception { mappingConfig.setGenerateEqualsAndHashCode(true); schemaFinder.setIncludePattern("optional-vs-mandatory-types.graphqls"); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()) - .generate(); + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/optional/InterfaceWithOptionalField.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/optional/" + + "InterfaceWithOptionalField.java.txt"), getFileByName(files, "InterfaceWithOptionalField.java")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/optional/TypeWithMandatoryField.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/optional/" + + "TypeWithMandatoryField.java.txt"), getFileByName(files, "TypeWithMandatoryField.java")); } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenParentInterfacesTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenParentInterfacesTest.java index afe2c5fee..29344841f 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenParentInterfacesTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenParentInterfacesTest.java @@ -42,25 +42,32 @@ void generate_CheckFiles() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertSameTrimmedContent( - new File("src/test/resources/expected-classes/parent-interfaces/QueryResolver.java.txt"), + new File("src/test/resources/expected-classes/parent-interfaces/" + + "QueryResolver.java.txt"), getFileByName(files, "QueryResolver.java")); assertSameTrimmedContent( - new File("src/test/resources/expected-classes/parent-interfaces/MutationResolver.java.txt"), + new File("src/test/resources/expected-classes/parent-interfaces/" + + "MutationResolver.java.txt"), getFileByName(files, "MutationResolver.java")); assertSameTrimmedContent( - new File("src/test/resources/expected-classes/parent-interfaces/SubscriptionResolver.java.txt"), + new File("src/test/resources/expected-classes/parent-interfaces/" + + "SubscriptionResolver.java.txt"), getFileByName(files, "SubscriptionResolver.java")); assertSameTrimmedContent( - new File("src/test/resources/expected-classes/parent-interfaces/VersionQueryResolver.java.txt"), + new File("src/test/resources/expected-classes/parent-interfaces/" + + "VersionQueryResolver.java.txt"), getFileByName(files, "VersionQueryResolver.java")); assertSameTrimmedContent( - new File("src/test/resources/expected-classes/parent-interfaces/CreateEventMutationResolver.java.txt"), + new File("src/test/resources/expected-classes/parent-interfaces/" + + "CreateEventMutationResolver.java.txt"), getFileByName(files, "CreateEventMutationResolver.java")); assertSameTrimmedContent( - new File("src/test/resources/expected-classes/parent-interfaces/EventsCreatedSubscriptionResolver.java.txt"), + new File("src/test/resources/expected-classes/parent-interfaces/" + + "EventsCreatedSubscriptionResolver.java.txt"), getFileByName(files, "EventsCreatedSubscriptionResolver.java")); assertSameTrimmedContent( - new File("src/test/resources/expected-classes/parent-interfaces/EventResolver.java.txt"), + new File("src/test/resources/expected-classes/parent-interfaces/" + + "EventResolver.java.txt"), getFileByName(files, "EventResolver.java")); } } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenRelayTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenRelayTest.java index 6ead7c18c..7cc4826bc 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenRelayTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenRelayTest.java @@ -41,7 +41,8 @@ void cleanup() { @Test void generateServerSideRelayClasses() throws Exception { - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); @@ -59,11 +60,13 @@ void generateServerSideRelayClasses() throws Exception { void generateServerSideRelayClasses_CustomGenericsConnectionType() throws Exception { mappingConfig.getRelayConfig() .setConnectionType("reactor.core.publisher.Mono>"); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/relay/UsersQueryResolver_reactive.java.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/relay/UsersQueryResolver_reactive.java.txt"), getFileByName(files, "UsersQueryResolver.java")); } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenRequestTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenRequestTest.java index 4051b22a7..a7cf49bd2 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenRequestTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenRequestTest.java @@ -8,7 +8,6 @@ import org.junit.jupiter.api.Test; import java.io.File; -import java.util.Collections; import java.util.Objects; import static com.kobylynskyi.graphql.codegen.TestUtils.assertSameTrimmedContent; @@ -48,19 +47,26 @@ void generate_RequestAndResponseProjections() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/EventResponseProjection.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "EventResponseProjection.java.txt"), getFileByName(files, "EventResponseProjection.java")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/EventPropertyResponseProjection.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "EventPropertyResponseProjection.java.txt"), getFileByName(files, "EventPropertyResponseProjection.java")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/EventPropertyParentParametrizedInput.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "EventPropertyParentParametrizedInput.java.txt"), getFileByName(files, "EventPropertyParentParametrizedInput.java")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/EventPropertyChildParametrizedInput.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "EventPropertyChildParametrizedInput.java.txt"), getFileByName(files, "EventPropertyChildParametrizedInput.java")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/EventsByCategoryAndStatusQueryRequest.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "EventsByCategoryAndStatusQueryRequest.java.txt"), getFileByName(files, "EventsByCategoryAndStatusQueryRequest.java")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/VersionQueryRequest.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "VersionQueryRequest.java.txt"), getFileByName(files, "VersionQueryRequest.java")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/EventsByIdsQueryRequest.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "EventsByIdsQueryRequest.java.txt"), getFileByName(files, "EventsByIdsQueryRequest.java")); } @@ -72,11 +78,14 @@ void generate_WithModelSuffix() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/EventStatusTO.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "EventStatusTO.java.txt"), getFileByName(files, "EventStatusTO.java")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/EventsByCategoryAndStatusQueryRequest_withModelSuffix.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "EventsByCategoryAndStatusQueryRequest_withModelSuffix.java.txt"), getFileByName(files, "EventsByCategoryAndStatusQueryRequest.java")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/EventPropertyParentParametrizedInput_withModelSuffix.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "EventPropertyParentParametrizedInput_withModelSuffix.java.txt"), getFileByName(files, "EventPropertyParentParametrizedInput.java")); } @@ -87,7 +96,8 @@ void generate_PrimitivesInsideParametrizedInput() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/ClientDataParametrizedInput.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "ClientDataParametrizedInput.java.txt"), getFileByName(files, "ClientDataParametrizedInput.java")); } @@ -98,10 +108,12 @@ void generate_RequestAndResponseProjections_github() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/CodeOfConductResponseProjection.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "CodeOfConductResponseProjection.java.txt"), getFileByName(files, "CodeOfConductResponseProjection.java")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/UpdateRepositoryMutationRequest.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "UpdateRepositoryMutationRequest.java.txt"), getFileByName(files, "UpdateRepositoryMutationRequest.java")); } @@ -112,7 +124,8 @@ void generate_ToStringIsEnabledForInput() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/AcceptTopicSuggestionInput.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "AcceptTopicSuggestionInput.java.txt"), getFileByName(files, "AcceptTopicSuggestionInput.java")); } @@ -149,7 +162,8 @@ void generate_apiImportForModelClassesIfResolverIsPresent() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/EventsByCategoryAndStatusQueryRequest_withApiImport.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "EventsByCategoryAndStatusQueryRequest_withApiImport.java.txt"), getFileByName(files, "EventsByCategoryAndStatusQueryRequest.java")); } @@ -163,7 +177,8 @@ void generate_apiImportForModelClassesIfResolversExtensions() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/EventsByCategoryAndStatusQueryRequest_withApiImport.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "EventsByCategoryAndStatusQueryRequest_withApiImport.java.txt"), getFileByName(files, "EventsByCategoryAndStatusQueryRequest.java")); } @@ -174,10 +189,12 @@ void generate_QueriesWithSameName() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/ProductsByCategoryIdAndStatusQueryRequest.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "ProductsByCategoryIdAndStatusQueryRequest.java.txt"), getFileByName(files, "ProductsByCategoryIdAndStatusQueryRequest.java")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/ProductsByIdsQueryRequest.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "ProductsByIdsQueryRequest.java.txt"), getFileByName(files, "ProductsByIdsQueryRequest.java")); } @@ -189,7 +206,8 @@ void generate_ClassesWithoutPrimitiveTypes() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/EventPropertyChildParametrizedInput_withoutPrimitives.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "EventPropertyChildParametrizedInput_withoutPrimitives.java.txt"), getFileByName(files, "EventPropertyChildParametrizedInput.java")); } @@ -202,7 +220,8 @@ void generate_UseObjectMapperToSerializeFields_Type() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/Event_useObjectMapperForRequestSerialization.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "Event_useObjectMapperForRequestSerialization.java.txt"), getFileByName(files, "Event.java")); } @@ -215,7 +234,8 @@ void generate_UseObjectMapperToSerializeFields_Field() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/Event_useObjectMapperForRequestSerialization.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "Event_useObjectMapperForRequestSerialization.java.txt"), getFileByName(files, "Event.java")); } @@ -227,7 +247,8 @@ void generate_UseObjectMapperToSerializeFields_Parameter() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/QueryINeedQueryRequest_custom_serializer.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/" + + "QueryINeedQueryRequest_custom_serializer.java.txt"), getFileByName(files, "QueryINeedQueryRequest.java")); } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenResponseTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenResponseTest.java index 4c120ff00..32fb4e604 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenResponseTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenResponseTest.java @@ -41,11 +41,14 @@ void generate_RequestAndResponseProjections() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/response/EventsByCategoryAndStatusQueryResponse.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/response/" + + "EventsByCategoryAndStatusQueryResponse.java.txt"), getFileByName(files, "EventsByCategoryAndStatusQueryResponse.java")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/response/VersionQueryResponse.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/response/" + + "VersionQueryResponse.java.txt"), getFileByName(files, "VersionQueryResponse.java")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/response/EventsByIdsQueryResponse.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/response/" + + "EventsByIdsQueryResponse.java.txt"), getFileByName(files, "EventsByIdsQueryResponse.java")); } @@ -57,9 +60,11 @@ void generate_RequestAndResponseProjections_Interfaces() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/response/VehicleResponseProjection.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/response/" + + "VehicleResponseProjection.java.txt"), getFileByName(files, "VehicleResponseProjection.java")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/response/LocationResponseProjection.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/response/" + + "LocationResponseProjection.java.txt"), getFileByName(files, "LocationResponseProjection.java")); } @@ -71,9 +76,11 @@ void generate_projections_with_selectAll() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/projection-with-selectAll/VehicleResponseProjection.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/projection-with-selectAll/" + + "VehicleResponseProjection.java.txt"), getFileByName(files, "VehicleResponseProjection.java")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/projection-with-selectAll/LocationResponseProjection.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/projection-with-selectAll/" + + "LocationResponseProjection.java.txt"), getFileByName(files, "LocationResponseProjection.java")); } @@ -84,7 +91,8 @@ void generate_ResponseWithPrimitiveType() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/response/VersionQueryResponse_int.java.txt"), + assertSameTrimmedContent(new File("src/test/resources/expected-classes/response/" + + "VersionQueryResponse_int.java.txt"), getFileByName(files, "VersionQueryResponse.java")); } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenRestrictedWordsTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenRestrictedWordsTest.java index 156cc90fd..9def4f494 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenRestrictedWordsTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenRestrictedWordsTest.java @@ -51,8 +51,8 @@ void generate() throws Exception { "Synchronized.java", "SynchronizedResponseProjection.java", "TestEnum.java"), generatedFileNames); for (File file : files) { - assertSameTrimmedContent( - new File(String.format("src/test/resources/expected-classes/restricted-words/%s.txt", file.getName())), + assertSameTrimmedContent(new File( + String.format("src/test/resources/expected-classes/restricted-words/%s.txt", file.getName())), file); } } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenTest.java index 24c0e8cc9..fb75abf12 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenTest.java @@ -69,7 +69,8 @@ void generate_CheckFiles() throws Exception { assertEquals(Arrays.asList( "CreateEventMutationResolver.java", "Event.java", "EventByIdQueryResolver.java", "EventProperty.java", "EventStatus.java", "EventsByCategoryAndStatusQueryResolver.java", "EventsByIdsQueryResolver.java", - "EventsCreatedSubscriptionResolver.java", "MutationResolver.java", "QueryResolver.java", "SubscriptionResolver.java", + "EventsCreatedSubscriptionResolver.java", "MutationResolver.java", "QueryResolver.java", + "SubscriptionResolver.java", "VersionQueryResolver.java"), generatedFileNames); for (File file : files) { @@ -101,7 +102,8 @@ void generate_CustomMappings() throws Exception { @Test void generate_CustomMappings_Nested() throws Exception { - mappingConfig.setCustomTypesMapping(new HashMap<>(singletonMap("EventProperty.intVal", "java.math.BigInteger"))); + mappingConfig + .setCustomTypesMapping(new HashMap<>(singletonMap("EventProperty.intVal", "java.math.BigInteger"))); generate("src/test/resources/schemas/test.graphqls"); @@ -141,7 +143,8 @@ void generate_NoPackage() throws Exception { File[] files = Objects.requireNonNull(outputBuildDir.listFiles()); assertFileContainsElements(files, "Event.java", System.lineSeparator() + "/**" + System.lineSeparator() + - " * An event that describes a thing that happens" + System.lineSeparator() + + " * An event that describes a thing that happens" + System + .lineSeparator() + " */" + System.lineSeparator()); } @@ -155,7 +158,9 @@ void generate_CustomModelAndApiPackages() throws Exception { File[] apiFiles = Objects.requireNonNull(new File(outputJavaClassesDir, "api").listFiles()); List generatedApiFileNames = Arrays.stream(apiFiles).map(File::getName).sorted().collect(toList()); assertEquals(Arrays.asList("CreateEventMutationResolver.java", "EventByIdQueryResolver.java", - "EventsByCategoryAndStatusQueryResolver.java", "EventsByIdsQueryResolver.java", "EventsCreatedSubscriptionResolver.java", "MutationResolver.java", "QueryResolver.java", + "EventsByCategoryAndStatusQueryResolver.java", "EventsByIdsQueryResolver.java", + "EventsCreatedSubscriptionResolver.java", "MutationResolver.java", + "QueryResolver.java", "SubscriptionResolver.java", "VersionQueryResolver.java"), generatedApiFileNames); for (File apiFile : apiFiles) { @@ -197,7 +202,8 @@ void generate_EqualsAndHashCode() throws Exception { } } - assertSameTrimmedContent(new File("src/test/resources/expected-classes/EventPropertyTO_withEqualsAndHashCode.java.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/EventPropertyTO_withEqualsAndHashCode.java.txt"), getFileByName(files, "EventPropertyTO.java")); } @@ -236,7 +242,8 @@ void generate_GeneratedAnnotation() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertNotEquals(0, files.length); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/EventPropertyTO_withoutGeneratedAnnotation.java.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/EventPropertyTO_withoutGeneratedAnnotation.java.txt"), getFileByName(files, "EventPropertyTO.java")); } @@ -250,7 +257,8 @@ void generate_NoSchemas() { @Test void generate_WrongSchema() { - GraphQLCodegen graphQLCodegen = new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/wrong.graphqls"), + GraphQLCodegen graphQLCodegen = new JavaGraphQLCodegen( + singletonList("src/test/resources/schemas/wrong.graphqls"), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()); assertThrows(NoSuchFileException.class, graphQLCodegen::generate); @@ -332,7 +340,8 @@ void generate_CustomSubscriptionReturnType() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertFileContainsElements(files, "EventsCreatedSubscriptionResolver.java", - "org.reactivestreams.Publisher> eventsCreated() throws Exception;"); + "org.reactivestreams.Publisher> eventsCreated() throws " + + "Exception;"); } @Test @@ -341,8 +350,10 @@ void generate_deprecated() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); List generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList()); - assertEquals(Arrays.asList("CreateEventMutationResolver.java", "Event.java", "EventInput.java", "EventsQueryResolver.java", - "MutationResolver.java", "Node.java", "PinnableItem.java", "QueryResolver.java", "Status.java"), generatedFileNames); + assertEquals(Arrays.asList("CreateEventMutationResolver.java", "Event.java", "EventInput.java", + "EventsQueryResolver.java", + "MutationResolver.java", "Node.java", "PinnableItem.java", "QueryResolver.java", + "Status.java"), generatedFileNames); for (File file : files) { assertSameTrimmedContent( @@ -357,7 +368,8 @@ void generate_QueriesWithSameName() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/ProductsByCategoryIdAndStatusQueryResolver.java.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/ProductsByCategoryIdAndStatusQueryResolver.java.txt"), getFileByName(files, "ProductsByCategoryIdAndStatusQueryResolver.java")); assertSameTrimmedContent(new File("src/test/resources/expected-classes/ProductsByIdsQueryResolver.java.txt"), diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenValidateTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenValidateTest.java index 33cb53e49..b318b9151 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenValidateTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenValidateTest.java @@ -13,7 +13,8 @@ class GraphQLCodegenValidateTest { @Test void validate_Invalid() { - GraphQLCodegenValidate graphQLCodegenValidate = new GraphQLCodegenValidate(singletonList("src/test/resources/schemas/invalid.graphqls")); + GraphQLCodegenValidate graphQLCodegenValidate = new GraphQLCodegenValidate(singletonList( + "src/test/resources/schemas/invalid.graphqls")); assertThrows(SchemaValidationException.class, graphQLCodegenValidate::validate); } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenCustomScalarMappingTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenCustomScalarMappingTest.java index 8cf7075e9..cc2e54c74 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenCustomScalarMappingTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenCustomScalarMappingTest.java @@ -14,7 +14,9 @@ import static com.kobylynskyi.graphql.codegen.TestUtils.assertSameTrimmedContent; import static com.kobylynskyi.graphql.codegen.TestUtils.getFileByName; -import static java.util.Collections.*; +import static java.util.Collections.singleton; +import static java.util.Collections.singletonList; +import static java.util.Collections.singletonMap; class GraphQLCodegenCustomScalarMappingTest { @@ -47,7 +49,8 @@ void generate_CustomTypeMapping_WholeScalar() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertSameTrimmedContent( - new File("src/test/resources/expected-classes/kt/custom-type/QueryINeedQueryRequest_whole_scalar.kt.txt"), + new File("src/test/resources/expected-classes/kt/custom-type/" + + "QueryINeedQueryRequest_whole_scalar.kt.txt"), getFileByName(files, "QueryINeedQueryRequest.kt")); } @@ -83,7 +86,8 @@ void generate_UseObjectMapperToSerializeFields_Parameter() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/kt/QueryINeedQueryRequest_custom_serializer.kt.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/kt/QueryINeedQueryRequest_custom_serializer.kt.txt"), getFileByName(files, "QueryINeedQueryRequest.kt")); } } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenDeprecatedTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenDeprecatedTest.java index 547eed890..7662cd652 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenDeprecatedTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenDeprecatedTest.java @@ -39,12 +39,15 @@ void cleanup() { @Test void generate_deprecated() throws Exception { - new KotlinGraphQLCodegen(Collections.singletonList("src/test/resources/schemas/deprecated-with-msg.graphqls"), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + new KotlinGraphQLCodegen(Collections.singletonList("src/test/resources/schemas/deprecated-with-msg.graphqls"), + outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); List generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList()); - assertEquals(Arrays.asList("CreateEventMutationResolver.kt", "Event.kt", "EventInput.kt", "EventsQueryResolver.kt", - "MutationResolver.kt", "Node.kt", "PinnableItem.kt", "QueryResolver.kt", "Status.kt"), generatedFileNames); + assertEquals( + Arrays.asList("CreateEventMutationResolver.kt", "Event.kt", "EventInput.kt", "EventsQueryResolver.kt", + "MutationResolver.kt", "Node.kt", "PinnableItem.kt", "QueryResolver.kt", "Status.kt"), + generatedFileNames); for (File file : files) { assertSameTrimmedContent( diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenEmptyTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenEmptyTest.java index 2725259ed..8124f7757 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenEmptyTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenEmptyTest.java @@ -44,7 +44,8 @@ void cleanup() { @Test void generateServerSideClasses() throws Exception { - new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); @@ -63,7 +64,8 @@ void generateServerSideClasses() throws Exception { void generateClientSideClasses() throws Exception { mappingConfig.setGenerateApis(false); mappingConfig.setGenerateClient(true); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenGitHubTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenGitHubTest.java index bdd30f041..9a3672ab0 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenGitHubTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenGitHubTest.java @@ -25,6 +25,10 @@ class GraphQLCodegenGitHubTest { private final File outputktClassesDir = new File("build/generated/com/github/graphql"); private final MappingConfig mappingConfig = new MappingConfig(); + private static String getFileContent(File[] files, String fileName) throws IOException { + return Utils.getFileContent(getFileByName(files, fileName).getPath()); + } + @BeforeEach void init() { mappingConfig.setGenerateParameterizedFieldsResolvers(false); @@ -57,7 +61,8 @@ void generate_MultipleInterfacesPerType() throws Exception { assertSameTrimmedContent(new File("src/test/resources/expected-classes/kt/ProfileOwner.kt.txt"), getFileByName(files, "ProfileOwner.kt")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/kt/AcceptTopicSuggestionMutationResponse.kt.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/kt/AcceptTopicSuggestionMutationResponse.kt.txt"), getFileByName(files, "AcceptTopicSuggestionMutationResponse.kt")); } @@ -103,17 +108,14 @@ void generate_Client_ConditionalFragments() throws Exception { outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputktClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/kt/SearchResultItemConnectionResponseProjection.kt.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/kt/SearchResultItemConnectionResponseProjection.kt.txt"), getFileByName(files, "SearchResultItemConnectionResponseProjection.kt")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/kt/SearchResultItemResponseProjection.kt.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/kt/SearchResultItemResponseProjection.kt.txt"), getFileByName(files, "SearchResultItemResponseProjection.kt")); } - private static String getFileContent(File[] files, String fileName) throws IOException { - return Utils.getFileContent(getFileByName(files, fileName).getPath()); - } - - @Test void generate_ResponseWithPrimitiveType() throws Exception { mappingConfig.putCustomTypeMappingIfAbsent("Int!", "Int"); @@ -135,11 +137,14 @@ void generate_ktList() throws Exception { File[] files = Objects.requireNonNull(outputktClassesDir.listFiles()); assertSameTrimmedContent(new File("src/test/resources/expected-classes/kt/AddLabelsToLabelableInput.kt.txt"), getFileByName(files, "AddLabelsToLabelableInput.kt")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/kt/AddLabelsToLabelableMutationRequest.kt.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/kt/AddLabelsToLabelableMutationRequest.kt.txt"), getFileByName(files, "AddLabelsToLabelableMutationRequest.kt")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/kt/AddLabelsToLabelableMutationResolver.kt.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/kt/AddLabelsToLabelableMutationResolver.kt.txt"), getFileByName(files, "AddLabelsToLabelableMutationResolver.kt")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/kt/AddLabelsToLabelableMutationResponse.kt.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/kt/AddLabelsToLabelableMutationResponse.kt.txt"), getFileByName(files, "AddLabelsToLabelableMutationResponse.kt")); assertSameTrimmedContent(new File("src/test/resources/expected-classes/kt/AddLabelsToLabelablePayload.kt.txt"), getFileByName(files, "AddLabelsToLabelablePayload.kt")); @@ -172,9 +177,13 @@ void generate_CustomFieldsResolvers() throws Exception { File[] files = Objects.requireNonNull(outputktClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/kt/field-resolver/GithubAcceptTopicSuggestionPayloadTO.kt.txt"), + assertSameTrimmedContent(new File( + "src/test/resources/expected-classes/kt/field-resolver/" + + "GithubAcceptTopicSuggestionPayloadTO.kt.txt"), getFileByName(files, "GithubAcceptTopicSuggestionPayloadTO.kt")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/kt/field-resolver/AcceptTopicSuggestionPayloadResolver.kt.txt"), + assertSameTrimmedContent(new File( + "src/test/resources/expected-classes/kt/field-resolver/" + + "AcceptTopicSuggestionPayloadResolver.kt.txt"), getFileByName(files, "AcceptTopicSuggestionPayloadResolver.kt")); } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenInterfacesTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenInterfacesTest.java index 33819556f..805680375 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenInterfacesTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenInterfacesTest.java @@ -21,17 +21,17 @@ class GraphQLCodegenInterfacesTest { - private GraphQLCodegen generator; private final MappingConfig mappingConfig = new MappingConfig(); - private final File outputBuildDir = new File("build/generated"); private final File outputJavaClassesDir = new File("build/generated/com/kobylynskyi/graphql/interfaces"); + private GraphQLCodegen generator; @BeforeEach void init() { mappingConfig.setGeneratedLanguage(GeneratedLanguage.KOTLIN); mappingConfig.setPackageName("com.kobylynskyi.graphql.interfaces"); - generator = new KotlinGraphQLCodegen(Collections.singletonList("src/test/resources/schemas/interfaces.graphqls"), + generator = new KotlinGraphQLCodegen( + Collections.singletonList("src/test/resources/schemas/interfaces.graphqls"), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()); } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenNullableTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenNullableTest.java index 2c6e3e2a4..5809ac722 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenNullableTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenNullableTest.java @@ -38,7 +38,8 @@ void generatePrimitiveTypesResponseResolverClasses_nullable() throws Exception { mappingConfig.setGenerateApis(true); mappingConfig.setGenerateClient(true); schemaFinder.setIncludePattern("nullable-extend.graphqls"); - new KotlinGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + new KotlinGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -72,13 +73,14 @@ void generatePrimitiveTypesResponseResolverClasses_nullable() throws Exception { } @Test - void generatePrimitiveTypesResponseResolverClasses_nullable_WITH_Prefix_Suffix() throws Exception { + void generatePrimitiveTypesResponseResolverClasses_nullable_With_Prefix_Suffix() throws Exception { mappingConfig.setGenerateApis(true); mappingConfig.setGenerateClient(true); mappingConfig.setModelNamePrefix("Test"); mappingConfig.setModelNameSuffix("DTO"); schemaFinder.setIncludePattern("nullable-extend.graphqls"); - new KotlinGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + new KotlinGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertSameTrimmedContent( @@ -96,14 +98,17 @@ void generate_OptionalFieldInInterfaceAndMandatoryInType() throws Exception { mappingConfig.setGenerateEqualsAndHashCode(true); schemaFinder.setIncludePattern("optional-vs-mandatory-types.graphqls"); - new KotlinGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()) + new KotlinGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()) .generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/kt/optional/InterfaceWithOptionalField.kt.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/kt/optional/InterfaceWithOptionalField.kt.txt"), getFileByName(files, "InterfaceWithOptionalField.kt")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/kt/optional/TypeWithMandatoryField.kt.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/kt/optional/TypeWithMandatoryField.kt.txt"), getFileByName(files, "TypeWithMandatoryField.kt")); } } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenRelayTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenRelayTest.java index 0cd75a2d3..fc5d62209 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenRelayTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenRelayTest.java @@ -43,7 +43,8 @@ void cleanup() { @Test void generateServerSideRelayClasses() throws Exception { - new KotlinGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + new KotlinGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); @@ -61,11 +62,13 @@ void generateServerSideRelayClasses() throws Exception { void generateServerSideRelayClasses_CustomGenericsConnectionType() throws Exception { mappingConfig.getRelayConfig() .setConnectionType("reactor.core.publisher.Mono>"); - new KotlinGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + new KotlinGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/kt/relay/UsersQueryResolver_reactive.kt.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/kt/relay/UsersQueryResolver_reactive.kt.txt"), getFileByName(files, "UsersQueryResolver.kt")); } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenRestrictedWordsAndParameterInputTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenRestrictedWordsAndParameterInputTest.java index a4f03724d..b1d3df2bf 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenRestrictedWordsAndParameterInputTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/kotlin/GraphQLCodegenRestrictedWordsAndParameterInputTest.java @@ -44,16 +44,21 @@ void generate() throws Exception { outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - List filters = Arrays.asList("Char.kt", "CharResponseProjection.kt", "FunQueryRequest.kt", "FunQueryResponse.kt", "QueryFunParametrizedInput.kt", - "Super.kt", "TestEnum.kt", "WhenQueryAPI.kt"); - List generatedFileNames = Arrays.stream(files).map(File::getName).filter(f -> filters.contains(f)).sorted().collect(toList()); - assertEquals(Arrays.asList("Char.kt", "CharResponseProjection.kt", "FunQueryRequest.kt", "FunQueryResponse.kt", "QueryFunParametrizedInput.kt", + List filters = Arrays + .asList("Char.kt", "CharResponseProjection.kt", "FunQueryRequest.kt", "FunQueryResponse.kt", + "QueryFunParametrizedInput.kt", + "Super.kt", "TestEnum.kt", "WhenQueryAPI.kt"); + List generatedFileNames = Arrays.stream(files).map(File::getName).filter(f -> filters.contains(f)) + .sorted().collect(toList()); + assertEquals(Arrays.asList("Char.kt", "CharResponseProjection.kt", "FunQueryRequest.kt", "FunQueryResponse.kt", + "QueryFunParametrizedInput.kt", "Super.kt", "TestEnum.kt", "WhenQueryAPI.kt"), generatedFileNames); for (File file : files) { if (filters.contains(file.getName())) { assertSameTrimmedContent( - new File(String.format("src/test/resources/expected-classes/kt/restricted-words/%s.txt", file.getName())), + new File(String.format("src/test/resources/expected-classes/kt/restricted-words/%s.txt", + file.getName())), file); } } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/model/MappingConfigTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/model/MappingConfigTest.java index 183c08486..61baead97 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/model/MappingConfigTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/model/MappingConfigTest.java @@ -19,6 +19,150 @@ @SuppressWarnings("unchecked") class MappingConfigTest { + private static Map hashMap(AbstractMap.SimpleEntry... entries) { + return Arrays.stream(entries).collect( + Collectors.toMap(AbstractMap.SimpleEntry::getKey, AbstractMap.SimpleEntry::getValue, (a, b) -> b)); + } + + private static MappingConfig buildMappingConfig() { + MappingConfig config = new MappingConfig(); + config.setCustomTypesMapping(new HashMap<>(singletonMap("1", "2"))); + config.setCustomAnnotationsMapping(new HashMap<>(singletonMap("3", singletonList("4")))); + config.setDirectiveAnnotationsMapping(new HashMap<>(singletonMap("5", singletonList("6")))); + config.setApiPackageName("ApiPackageName"); + config.setGenerateBuilder(true); + config.setGenerateApis(true); + config.setGenerateEqualsAndHashCode(true); + config.setGenerateImmutableModels(false); + config.setGenerateToString(true); + config.setModelNamePrefix("ModelNamePrefix"); + config.setModelNameSuffix("ModelNameSuffix"); + config.setModelPackageName("ModelPackageName"); + config.setModelValidationAnnotation("ModelValidationAnnotation"); + config.setPackageName("PackageName"); + config.setApiReturnType("ApiReturnType"); + config.setApiReturnListType("ApiReturnListType"); + config.setSubscriptionReturnType("SubscriptionsReturnType"); + config.setGenerateParameterizedFieldsResolvers(true); + config.setGenerateExtensionFieldsResolvers(true); + config.setUseOptionalForNullableReturnTypes(true); + config.setApiInterfaceStrategy(ApiInterfaceStrategy.INTERFACE_PER_OPERATION); + config.setApiNamePrefixStrategy(ApiNamePrefixStrategy.FOLDER_NAME_AS_PREFIX); + config.setApiRootInterfaceStrategy(ApiRootInterfaceStrategy.SINGLE_INTERFACE); + config.setFieldsWithResolvers(new HashSet<>(singletonList("5"))); + config.setFieldsWithoutResolvers(new HashSet<>(singleton("8"))); + config.setRequestSuffix("6"); + config.setResponseSuffix("10"); + config.setResponseProjectionSuffix("7"); + config.setGenerateClient(false); + config.setGenerateModelsForRootTypes(false); + config.setGenerateApisWithThrowsException(true); + config.setAddGeneratedAnnotation(true); + config.setParametrizedInputSuffix("9"); + config.setTypeResolverPrefix("11"); + config.setTypeResolverSuffix("12"); + RelayConfig relayConfig = new RelayConfig(); + relayConfig.setDirectiveArgumentName("key"); + config.setRelayConfig(relayConfig); + return config; + } + + private static MappingConfig buildMappingConfig2() { + MappingConfig config = new MappingConfig(); + config.setCustomTypesMapping(new HashMap<>(singletonMap("11", "22"))); + config.setCustomAnnotationsMapping(new HashMap<>(singletonMap("33", singletonList("44")))); + config.setDirectiveAnnotationsMapping(new HashMap<>(singletonMap("55", singletonList("66")))); + config.setApiPackageName("ApiPackageName2"); + config.setGenerateBuilder(false); + config.setGenerateApis(false); + config.setGenerateImmutableModels(true); + config.setGenerateEqualsAndHashCode(false); + config.setGenerateToString(false); + config.setModelNamePrefix("ModelNamePrefix2"); + config.setModelNameSuffix("ModelNameSuffix2"); + config.setModelPackageName("ModelPackageName2"); + config.setModelValidationAnnotation("ModelValidationAnnotation2"); + config.setPackageName("PackageName2"); + config.setApiReturnType("ApiReturnType2"); + config.setApiReturnListType("ApiReturnListType2"); + config.setSubscriptionReturnType("SubscriptionsReturnType2"); + config.setGenerateParameterizedFieldsResolvers(false); + config.setGenerateExtensionFieldsResolvers(false); + config.setUseOptionalForNullableReturnTypes(false); + config.setApiInterfaceStrategy(ApiInterfaceStrategy.DO_NOT_GENERATE); + config.setApiNamePrefixStrategy(ApiNamePrefixStrategy.FILE_NAME_AS_PREFIX); + config.setApiRootInterfaceStrategy(ApiRootInterfaceStrategy.DO_NOT_GENERATE); + config.setFieldsWithResolvers(singleton("55")); + config.setFieldsWithoutResolvers(singleton("88")); + config.setRequestSuffix("66"); + config.setResponseSuffix("1010"); + config.setResponseProjectionSuffix("77"); + config.setGenerateClient(true); + config.setGenerateModelsForRootTypes(true); + config.setGenerateApisWithThrowsException(false); + config.setAddGeneratedAnnotation(false); + config.setParametrizedInputSuffix("99"); + config.setTypeResolverPrefix("1111"); + config.setTypeResolverSuffix("1212"); + RelayConfig relayConfig = new RelayConfig(); + relayConfig.setDirectiveArgumentName("for"); + config.setRelayConfig(relayConfig); + return config; + } + + private static MappingConfig buildEmptyMappingConfig() { + MappingConfig mappingConfig = new MappingConfig(); + mappingConfig.setCustomTypesMapping(null); + mappingConfig.setCustomAnnotationsMapping(null); + mappingConfig.setDirectiveAnnotationsMapping(null); + mappingConfig.setFieldsWithResolvers(null); + mappingConfig.setFieldsWithoutResolvers(null); + mappingConfig.setRelayConfig(null); + return mappingConfig; + } + + private static void compareMappingConfigs(MappingConfig mappingConfig, MappingConfig expectedMappingConfig) { + assertEquals(expectedMappingConfig.getCustomTypesMapping(), mappingConfig.getCustomTypesMapping()); + assertEquals(expectedMappingConfig.getCustomAnnotationsMapping(), mappingConfig.getCustomAnnotationsMapping()); + assertEquals(expectedMappingConfig.getDirectiveAnnotationsMapping(), + mappingConfig.getDirectiveAnnotationsMapping()); + assertEquals(expectedMappingConfig.getApiPackageName(), mappingConfig.getApiPackageName()); + assertEquals(expectedMappingConfig.getGenerateBuilder(), mappingConfig.getGenerateBuilder()); + assertEquals(expectedMappingConfig.getGenerateApis(), mappingConfig.getGenerateApis()); + assertEquals(expectedMappingConfig.getGenerateEqualsAndHashCode(), + mappingConfig.getGenerateEqualsAndHashCode()); + assertEquals(expectedMappingConfig.getGenerateImmutableModels(), mappingConfig.getGenerateImmutableModels()); + assertEquals(expectedMappingConfig.getGenerateToString(), mappingConfig.getGenerateToString()); + assertEquals(expectedMappingConfig.getSubscriptionReturnType(), mappingConfig.getSubscriptionReturnType()); + assertEquals(expectedMappingConfig.getApiReturnType(), mappingConfig.getApiReturnType()); + assertEquals(expectedMappingConfig.getApiReturnListType(), mappingConfig.getApiReturnListType()); + assertEquals(expectedMappingConfig.getModelNamePrefix(), mappingConfig.getModelNamePrefix()); + assertEquals(expectedMappingConfig.getModelNameSuffix(), mappingConfig.getModelNameSuffix()); + assertEquals(expectedMappingConfig.getModelPackageName(), mappingConfig.getModelPackageName()); + assertEquals(expectedMappingConfig.getModelValidationAnnotation(), + mappingConfig.getModelValidationAnnotation()); + assertEquals(expectedMappingConfig.getPackageName(), mappingConfig.getPackageName()); + assertEquals(expectedMappingConfig.getGenerateParameterizedFieldsResolvers(), + mappingConfig.getGenerateParameterizedFieldsResolvers()); + assertEquals(expectedMappingConfig.getGenerateExtensionFieldsResolvers(), + mappingConfig.getGenerateExtensionFieldsResolvers()); + assertEquals(expectedMappingConfig.getFieldsWithResolvers(), mappingConfig.getFieldsWithResolvers()); + assertEquals(expectedMappingConfig.getFieldsWithoutResolvers(), mappingConfig.getFieldsWithoutResolvers()); + assertEquals(expectedMappingConfig.getRequestSuffix(), mappingConfig.getRequestSuffix()); + assertEquals(expectedMappingConfig.getResponseSuffix(), mappingConfig.getResponseSuffix()); + assertEquals(expectedMappingConfig.getResponseProjectionSuffix(), mappingConfig.getResponseProjectionSuffix()); + assertEquals(expectedMappingConfig.getGenerateClient(), mappingConfig.getGenerateClient()); + assertEquals(expectedMappingConfig.getGenerateModelsForRootTypes(), + mappingConfig.getGenerateModelsForRootTypes()); + assertEquals(expectedMappingConfig.getGenerateApisWithThrowsException(), + mappingConfig.getGenerateApisWithThrowsException()); + assertEquals(expectedMappingConfig.getTypeResolverPrefix(), mappingConfig.getTypeResolverPrefix()); + assertEquals(expectedMappingConfig.getTypeResolverSuffix(), mappingConfig.getTypeResolverSuffix()); + assertEquals(expectedMappingConfig.getUseOptionalForNullableReturnTypes(), + mappingConfig.getUseOptionalForNullableReturnTypes()); + assertEquals(expectedMappingConfig.getRelayConfig(), mappingConfig.getRelayConfig()); + } + @Test void combineDefaultWithNull() { MappingConfig mappingConfig = buildEmptyMappingConfig(); @@ -127,9 +271,11 @@ void combineCustomWithCustom() { assertEquals(hashMap(new HashMap.SimpleEntry<>("1", "2"), new HashMap.SimpleEntry<>("11", "22")), mappingConfig.getCustomTypesMapping()); - assertEquals(hashMap(new HashMap.SimpleEntry<>("3", singletonList("4")), new HashMap.SimpleEntry<>("33", singletonList("44"))), + assertEquals(hashMap(new HashMap.SimpleEntry<>("3", singletonList("4")), + new HashMap.SimpleEntry<>("33", singletonList("44"))), mappingConfig.getCustomAnnotationsMapping()); - assertEquals(hashMap(new HashMap.SimpleEntry<>("5", singletonList("6")), new HashMap.SimpleEntry<>("55", singletonList("66"))), + assertEquals(hashMap(new HashMap.SimpleEntry<>("5", singletonList("6")), + new HashMap.SimpleEntry<>("55", singletonList("66"))), mappingConfig.getDirectiveAnnotationsMapping()); assertEquals("ApiPackageName2", mappingConfig.getApiPackageName()); assertFalse(mappingConfig.getGenerateBuilder()); @@ -166,140 +312,4 @@ void combineCustomWithCustom() { assertEquals("for", mappingConfig.getRelayConfig().getDirectiveArgumentName()); } - private static Map hashMap(AbstractMap.SimpleEntry... entries) { - return Arrays.stream(entries).collect( - Collectors.toMap(AbstractMap.SimpleEntry::getKey, AbstractMap.SimpleEntry::getValue, (a, b) -> b)); - } - - private static MappingConfig buildMappingConfig() { - MappingConfig config = new MappingConfig(); - config.setCustomTypesMapping(new HashMap<>(singletonMap("1", "2"))); - config.setCustomAnnotationsMapping(new HashMap<>(singletonMap("3", singletonList("4")))); - config.setDirectiveAnnotationsMapping(new HashMap<>(singletonMap("5", singletonList("6")))); - config.setApiPackageName("ApiPackageName"); - config.setGenerateBuilder(true); - config.setGenerateApis(true); - config.setGenerateEqualsAndHashCode(true); - config.setGenerateImmutableModels(false); - config.setGenerateToString(true); - config.setModelNamePrefix("ModelNamePrefix"); - config.setModelNameSuffix("ModelNameSuffix"); - config.setModelPackageName("ModelPackageName"); - config.setModelValidationAnnotation("ModelValidationAnnotation"); - config.setPackageName("PackageName"); - config.setApiReturnType("ApiReturnType"); - config.setApiReturnListType("ApiReturnListType"); - config.setSubscriptionReturnType("SubscriptionsReturnType"); - config.setGenerateParameterizedFieldsResolvers(true); - config.setGenerateExtensionFieldsResolvers(true); - config.setUseOptionalForNullableReturnTypes(true); - config.setApiInterfaceStrategy(ApiInterfaceStrategy.INTERFACE_PER_OPERATION); - config.setApiNamePrefixStrategy(ApiNamePrefixStrategy.FOLDER_NAME_AS_PREFIX); - config.setApiRootInterfaceStrategy(ApiRootInterfaceStrategy.SINGLE_INTERFACE); - config.setFieldsWithResolvers(new HashSet<>(singletonList("5"))); - config.setFieldsWithoutResolvers(new HashSet<>(singleton("8"))); - config.setRequestSuffix("6"); - config.setResponseSuffix("10"); - config.setResponseProjectionSuffix("7"); - config.setGenerateClient(false); - config.setGenerateModelsForRootTypes(false); - config.setGenerateApisWithThrowsException(true); - config.setAddGeneratedAnnotation(true); - config.setParametrizedInputSuffix("9"); - config.setTypeResolverPrefix("11"); - config.setTypeResolverSuffix("12"); - RelayConfig relayConfig = new RelayConfig(); - relayConfig.setDirectiveArgumentName("key"); - config.setRelayConfig(relayConfig); - return config; - } - - private static MappingConfig buildMappingConfig2() { - MappingConfig config = new MappingConfig(); - config.setCustomTypesMapping(new HashMap<>(singletonMap("11", "22"))); - config.setCustomAnnotationsMapping(new HashMap<>(singletonMap("33", singletonList("44")))); - config.setDirectiveAnnotationsMapping(new HashMap<>(singletonMap("55", singletonList("66")))); - config.setApiPackageName("ApiPackageName2"); - config.setGenerateBuilder(false); - config.setGenerateApis(false); - config.setGenerateImmutableModels(true); - config.setGenerateEqualsAndHashCode(false); - config.setGenerateToString(false); - config.setModelNamePrefix("ModelNamePrefix2"); - config.setModelNameSuffix("ModelNameSuffix2"); - config.setModelPackageName("ModelPackageName2"); - config.setModelValidationAnnotation("ModelValidationAnnotation2"); - config.setPackageName("PackageName2"); - config.setApiReturnType("ApiReturnType2"); - config.setApiReturnListType("ApiReturnListType2"); - config.setSubscriptionReturnType("SubscriptionsReturnType2"); - config.setGenerateParameterizedFieldsResolvers(false); - config.setGenerateExtensionFieldsResolvers(false); - config.setUseOptionalForNullableReturnTypes(false); - config.setApiInterfaceStrategy(ApiInterfaceStrategy.DO_NOT_GENERATE); - config.setApiNamePrefixStrategy(ApiNamePrefixStrategy.FILE_NAME_AS_PREFIX); - config.setApiRootInterfaceStrategy(ApiRootInterfaceStrategy.DO_NOT_GENERATE); - config.setFieldsWithResolvers(singleton("55")); - config.setFieldsWithoutResolvers(singleton("88")); - config.setRequestSuffix("66"); - config.setResponseSuffix("1010"); - config.setResponseProjectionSuffix("77"); - config.setGenerateClient(true); - config.setGenerateModelsForRootTypes(true); - config.setGenerateApisWithThrowsException(false); - config.setAddGeneratedAnnotation(false); - config.setParametrizedInputSuffix("99"); - config.setTypeResolverPrefix("1111"); - config.setTypeResolverSuffix("1212"); - RelayConfig relayConfig = new RelayConfig(); - relayConfig.setDirectiveArgumentName("for"); - config.setRelayConfig(relayConfig); - return config; - } - - private static MappingConfig buildEmptyMappingConfig() { - MappingConfig mappingConfig = new MappingConfig(); - mappingConfig.setCustomTypesMapping(null); - mappingConfig.setCustomAnnotationsMapping(null); - mappingConfig.setDirectiveAnnotationsMapping(null); - mappingConfig.setFieldsWithResolvers(null); - mappingConfig.setFieldsWithoutResolvers(null); - mappingConfig.setRelayConfig(null); - return mappingConfig; - } - - private static void compareMappingConfigs(MappingConfig mappingConfig, MappingConfig expectedMappingConfig) { - assertEquals(expectedMappingConfig.getCustomTypesMapping(), mappingConfig.getCustomTypesMapping()); - assertEquals(expectedMappingConfig.getCustomAnnotationsMapping(), mappingConfig.getCustomAnnotationsMapping()); - assertEquals(expectedMappingConfig.getDirectiveAnnotationsMapping(), mappingConfig.getDirectiveAnnotationsMapping()); - assertEquals(expectedMappingConfig.getApiPackageName(), mappingConfig.getApiPackageName()); - assertEquals(expectedMappingConfig.getGenerateBuilder(), mappingConfig.getGenerateBuilder()); - assertEquals(expectedMappingConfig.getGenerateApis(), mappingConfig.getGenerateApis()); - assertEquals(expectedMappingConfig.getGenerateEqualsAndHashCode(), mappingConfig.getGenerateEqualsAndHashCode()); - assertEquals(expectedMappingConfig.getGenerateImmutableModels(), mappingConfig.getGenerateImmutableModels()); - assertEquals(expectedMappingConfig.getGenerateToString(), mappingConfig.getGenerateToString()); - assertEquals(expectedMappingConfig.getSubscriptionReturnType(), mappingConfig.getSubscriptionReturnType()); - assertEquals(expectedMappingConfig.getApiReturnType(), mappingConfig.getApiReturnType()); - assertEquals(expectedMappingConfig.getApiReturnListType(), mappingConfig.getApiReturnListType()); - assertEquals(expectedMappingConfig.getModelNamePrefix(), mappingConfig.getModelNamePrefix()); - assertEquals(expectedMappingConfig.getModelNameSuffix(), mappingConfig.getModelNameSuffix()); - assertEquals(expectedMappingConfig.getModelPackageName(), mappingConfig.getModelPackageName()); - assertEquals(expectedMappingConfig.getModelValidationAnnotation(), mappingConfig.getModelValidationAnnotation()); - assertEquals(expectedMappingConfig.getPackageName(), mappingConfig.getPackageName()); - assertEquals(expectedMappingConfig.getGenerateParameterizedFieldsResolvers(), mappingConfig.getGenerateParameterizedFieldsResolvers()); - assertEquals(expectedMappingConfig.getGenerateExtensionFieldsResolvers(), mappingConfig.getGenerateExtensionFieldsResolvers()); - assertEquals(expectedMappingConfig.getFieldsWithResolvers(), mappingConfig.getFieldsWithResolvers()); - assertEquals(expectedMappingConfig.getFieldsWithoutResolvers(), mappingConfig.getFieldsWithoutResolvers()); - assertEquals(expectedMappingConfig.getRequestSuffix(), mappingConfig.getRequestSuffix()); - assertEquals(expectedMappingConfig.getResponseSuffix(), mappingConfig.getResponseSuffix()); - assertEquals(expectedMappingConfig.getResponseProjectionSuffix(), mappingConfig.getResponseProjectionSuffix()); - assertEquals(expectedMappingConfig.getGenerateClient(), mappingConfig.getGenerateClient()); - assertEquals(expectedMappingConfig.getGenerateModelsForRootTypes(), mappingConfig.getGenerateModelsForRootTypes()); - assertEquals(expectedMappingConfig.getGenerateApisWithThrowsException(), mappingConfig.getGenerateApisWithThrowsException()); - assertEquals(expectedMappingConfig.getTypeResolverPrefix(), mappingConfig.getTypeResolverPrefix()); - assertEquals(expectedMappingConfig.getTypeResolverSuffix(), mappingConfig.getTypeResolverSuffix()); - assertEquals(expectedMappingConfig.getUseOptionalForNullableReturnTypes(), mappingConfig.getUseOptionalForNullableReturnTypes()); - assertEquals(expectedMappingConfig.getRelayConfig(), mappingConfig.getRelayConfig()); - } - } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLRequestSerializerScalaTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLRequestSerializerScalaTest.java index a0f9a05c8..018f2d918 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLRequestSerializerScalaTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLRequestSerializerScalaTest.java @@ -7,12 +7,6 @@ class GraphQLRequestSerializerScalaTest { - @Test - void scalaOptionToString() { - assertEquals("1", getEntry(new Some())); - assertNull(getEntry(new None$())); - } - //Original method cannot test in Java public static String getEntry(Object input) { if (input.getClass().getSimpleName().equals("Some")) { @@ -23,6 +17,12 @@ public static String getEntry(Object input) { return input.toString(); } + @Test + void scalaOptionToString() { + assertEquals("1", getEntry(new Some())); + assertNull(getEntry(new None$())); + } + interface Option { } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLRequestSerializerTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLRequestSerializerTest.java index a5c339036..1e597bdf2 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLRequestSerializerTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLRequestSerializerTest.java @@ -29,7 +29,9 @@ import java.util.function.Function; import java.util.stream.Stream; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; class GraphQLRequestSerializerTest { @@ -64,21 +66,28 @@ private static Stream provideStaticSerializerForMultiRequest() { (Function) GraphQLRequestSerializerTest::jsonQuery)); } + private static String jsonQuery(String expectedQueryDecorator) { + return String.format("{\"query\":\"%s\"}", expectedQueryDecorator.replace("\\", "\\\\").replace("\"", "\\\"")); + } + @ParameterizedTest(name = "{0}") @MethodSource("provideStaticSerializers") - void serialize_Null(String name, Function serializer, Function expectedQueryDecorator) { + void serialize_Null(String name, Function serializer, + Function expectedQueryDecorator) { assertNull(serializer.apply(null)); } @ParameterizedTest(name = "{0}") @MethodSource("provideAllSerializers") - void serialize_Empty(String name, Function serializer, Function expectedQueryDecorator) { + void serialize_Empty(String name, Function serializer, + Function expectedQueryDecorator) { assertNull(serializer.apply(new GraphQLRequest(null))); } @ParameterizedTest(name = "{0}") @MethodSource("provideAllSerializers") - void serialize_noResponseProjection(String name, Function serializer, Function expectedQueryDecorator) { + void serialize_noResponseProjection(String name, Function serializer, + Function expectedQueryDecorator) { GraphQLRequest graphQLRequest = new GraphQLRequest(new VersionQueryRequest()); String serializedQuery = serializer.apply(graphQLRequest).replaceAll(" +", " ").trim(); String expectedQueryStr = "query { version }"; @@ -87,7 +96,8 @@ void serialize_noResponseProjection(String name, Function serializer, Function expectedQueryDecorator) { + void serialize_withResponseProjection(String name, Function serializer, + Function expectedQueryDecorator) { EventsByCategoryAndStatusQueryRequest request = new EventsByCategoryAndStatusQueryRequest.Builder() .setCategoryId("categoryIdValue1") .setStatus(Status.OPEN) @@ -98,10 +108,12 @@ void serialize_withResponseProjection(String name, Function serializer, Function expectedQueryDecorator) { + void serialize_withResponseProjectionAndAlias(String name, Function serializer, + Function expectedQueryDecorator) { EventsByCategoryAndStatusQueryRequest request = new EventsByCategoryAndStatusQueryRequest.Builder() .setCategoryId("categoryIdValue1") .setStatus(Status.OPEN) @@ -129,13 +142,16 @@ void serialize_withResponseProjectionAndAlias(String name, Function serializer, Function expectedQueryDecorator) { + void serialize_withResponseProjectionAndParametrizedInput(String name, Function serializer, + Function expectedQueryDecorator) { EventsByCategoryAndStatusQueryRequest request = new EventsByCategoryAndStatusQueryRequest.Builder() .setCategoryId("categoryIdValue1") .setStatus(Status.OPEN) @@ -164,12 +182,14 @@ void serialize_withResponseProjectionAndParametrizedInput(String name, Function< .active() .properties(new EventPropertyResponseProjection() .floatVal() - .child(new EventPropertyChildParametrizedInput() + .child( + new EventPropertyChildParametrizedInput() .last(-10) .first(+10), new EventPropertyResponseProjection() .intVal() - .parent(new EventPropertyParentParametrizedInput() + .parent( + new EventPropertyParentParametrizedInput() .withStatus(Status.OPEN), new EventResponseProjection() .id())) @@ -182,7 +202,8 @@ void serialize_withResponseProjectionAndParametrizedInput(String name, Function< "id " + "active " + "properties { " + - "floatVal child (first: 10, last: -10) { intVal parent (withStatus: OPEN) { id } } booleanVal } " + + "floatVal child (first: 10, last: -10) { intVal parent (withStatus: OPEN) { id } } " + + "booleanVal } " + "status " + "} " + "}"; @@ -191,7 +212,9 @@ void serialize_withResponseProjectionAndParametrizedInput(String name, Function< @ParameterizedTest(name = "{0}") @MethodSource("provideAllSerializers") - void serialize_withResponseProjectionAndParametrizedInputAndAlias(String name, Function serializer, Function expectedQueryDecorator) { + void serialize_withResponseProjectionAndParametrizedInputAndAlias(String name, + Function serializer, + Function expectedQueryDecorator) { EventsByCategoryAndStatusQueryRequest request = new EventsByCategoryAndStatusQueryRequest.Builder() .setCategoryId("categoryIdValue1") .setStatus(Status.OPEN) @@ -202,13 +225,16 @@ void serialize_withResponseProjectionAndParametrizedInputAndAlias(String name, F .active() .properties(new EventPropertyResponseProjection() .floatVal() - .child("myChild", new EventPropertyChildParametrizedInput() + .child("myChild", + new EventPropertyChildParametrizedInput() .last(-10) .first(+10), new EventPropertyResponseProjection() .intVal() - .parent("myParent", new EventPropertyParentParametrizedInput() - .withStatus(Status.OPEN), + .parent("myParent", + new EventPropertyParentParametrizedInput() + .withStatus( + Status.OPEN), new EventResponseProjection() .id())) .booleanVal()) @@ -220,7 +246,8 @@ void serialize_withResponseProjectionAndParametrizedInputAndAlias(String name, F "id " + "active " + "properties { " + - "floatVal myChild : child (first: 10, last: -10) { intVal myParent : parent (withStatus: OPEN) { id } } booleanVal } " + + "floatVal myChild : child (first: 10, last: -10) { intVal myParent : parent " + + "(withStatus: OPEN) { id } } booleanVal } " + "status " + "} " + "}"; @@ -229,7 +256,8 @@ void serialize_withResponseProjectionAndParametrizedInputAndAlias(String name, F @ParameterizedTest(name = "{0}") @MethodSource("provideAllSerializers") - void serialize_complexRequestWithDefaultData(String name, Function serializer, Function expectedQueryDecorator) { + void serialize_complexRequestWithDefaultData(String name, Function serializer, + Function expectedQueryDecorator) { UpdateIssueMutationRequest requestWithDefaultData = new UpdateIssueMutationRequest(); requestWithDefaultData.setInput(new UpdateIssueInput()); GraphQLRequest graphQLRequest = new GraphQLRequest(requestWithDefaultData, @@ -249,7 +277,8 @@ void serialize_complexRequestWithDefaultData(String name, Function serializer, Function expectedQueryDecorator) { + void serialize_UseObjectMapperForSomeFields(String name, Function serializer, + Function expectedQueryDecorator) { GraphQLRequestSerializer.OBJECT_MAPPER.registerModule( new SimpleModule().addSerializer(new ZonedDateTimeSerializer())); @@ -267,7 +296,8 @@ void serialize_UseObjectMapperForSomeFields(String name, Function serializer, Function expectedQueryDecorator) { + void serialize_UseObjectMapperForQueryParameter(String name, Function serializer, + Function expectedQueryDecorator) { GraphQLRequestSerializer.OBJECT_MAPPER.registerModule( new SimpleModule().addSerializer(new ZonedDateTimeSerializer())); @@ -282,7 +312,8 @@ void serialize_UseObjectMapperForQueryParameter(String name, Function serializer, Function expectedQueryDecorator) { + void serialize_UseObjectMapperForParameterizedInput(String name, Function serializer, + Function expectedQueryDecorator) { GraphQLRequestSerializer.OBJECT_MAPPER.registerModule( new SimpleModule().addSerializer(new ZonedDateTimeSerializer())); @@ -293,9 +324,15 @@ void serialize_UseObjectMapperForParameterizedInput(String name, Function serializer, Function expectedQueryDecorator) { + void serialize_complexRequest(String name, Function serializer, + Function expectedQueryDecorator) { UpdateIssueMutationRequest updateIssueMutationRequest = new UpdateIssueMutationRequest(); UpdateIssueInput input = new UpdateIssueInput(); input.setStringListEmptyDefault(Arrays.asList("", "1", null, "\"")); @@ -326,31 +364,36 @@ void serialize_complexRequest(String name, Function seri String expectedQueryStr = "mutation { updateIssue(input: { " + "floatVal: 1.23, booleanVal: false, intVal: 42, " + "stringVal: \"default \\\" \\\\ \\b \\f \\n \\r \\t ሴ \", " + - "enumVal: OPEN, intList: [ 1, 2, 3 ], intListEmptyDefault: [ \"\", \"1\", null, \"\\\"\" ] }){ " + + "enumVal: OPEN, intList: [ 1, 2, 3 ], intListEmptyDefault: [ \"\", \"1\", null, " + + "\"\\\"\" ] }){ " + "clientMutationId issue { activeLockReason } } }"; assertEquals(expectedQueryDecorator.apply(expectedQueryStr), serializedQuery); } @ParameterizedTest(name = "{0}") @MethodSource("provideAllSerializers") - void serialize_withConditionalFragments(String name, Function serializer, Function expectedQueryDecorator) { + void serialize_withConditionalFragments(String name, Function serializer, + Function expectedQueryDecorator) { GraphQLRequest graphQLRequest = new GraphQLRequest(new UpdateIssueMutationRequest(), new UpdateIssuePayloadResponseProjection() .union(new UpdateNodeUnionResponseProjection() .onIssue(new IssueResponseProjection() .activeLockReason()) - .onOrganization(new OrganizationResponseProjection() - .name()) + .onOrganization( + new OrganizationResponseProjection() + .name()) .typename())); String serializedQuery = serializer.apply(graphQLRequest).replaceAll(" +", " ").trim(); String expectedQueryStr = "mutation { updateIssue{ " + - "union { ...on Issue { activeLockReason } ...on Organization { name } __typename } } }"; + "union { ...on Issue { activeLockReason } ...on Organization { name } __typename } " + + "} }"; assertEquals(expectedQueryDecorator.apply(expectedQueryStr), serializedQuery); } @ParameterizedTest(name = "{0}") @MethodSource("provideAllSerializers") - void serialize_collectionRequest(String name, Function serializer, Function expectedQueryDecorator) { + void serialize_collectionRequest(String name, Function serializer, + Function expectedQueryDecorator) { EventsByIdsQueryRequest request = new EventsByIdsQueryRequest.Builder() .setIds(Arrays.asList("\"", "\\", "\b", "\f", "\n", "\r", "\t", "\u1234")) .build(); @@ -373,7 +416,8 @@ void serialize_collectionRequest(String name, Function s @ParameterizedTest(name = "{0}") @MethodSource("provideAllSerializers") - void serialize_collectionRequest_Null(String name, Function serializer, Function expectedQueryDecorator) { + void serialize_collectionRequest_Null(String name, Function serializer, + Function expectedQueryDecorator) { EventsByIdsQueryRequest request = new EventsByIdsQueryRequest.Builder() .setContextId("something") .setIds(null) @@ -390,7 +434,8 @@ void serialize_collectionRequest_Null(String name, Function serializer, Function expectedQueryDecorator) { + void serialize_AllInputsNull(String name, Function serializer, + Function expectedQueryDecorator) { EventsByIdsQueryRequest request = new EventsByIdsQueryRequest.Builder() .setContextId(null) .setIds(null) @@ -407,8 +452,10 @@ void serialize_AllInputsNull(String name, Function seria @ParameterizedTest(name = "{0}") @MethodSource("provideStaticSerializerForMultiRequest") - void serialize_multipleRequests(String name, Function serializer, Function expectedQueryDecorator) { - EventsByCategoryAndStatusQueryRequest request1 = new EventsByCategoryAndStatusQueryRequest.Builder().alias("req1").setStatus(Status.OPEN).build(); + void serialize_multipleRequests(String name, Function serializer, + Function expectedQueryDecorator) { + EventsByCategoryAndStatusQueryRequest request1 = new EventsByCategoryAndStatusQueryRequest.Builder() + .alias("req1").setStatus(Status.OPEN).build(); GraphQLRequest graphQLRequest1 = new GraphQLRequest(request1, new EventResponseProjection().id()); EventsByCategoryAndStatusQueryRequest request2 = new EventsByCategoryAndStatusQueryRequest("req2"); @@ -417,7 +464,9 @@ void serialize_multipleRequests(String name, Function s EventsByCategoryAndStatusQueryRequest request21 = new EventsByCategoryAndStatusQueryRequest(); GraphQLRequest graphQLRequest21 = new GraphQLRequest(request21); - String serializedQuery = serializer.apply(new GraphQLRequests(graphQLRequest1, graphQLRequest2, graphQLRequest21)).replaceAll(" +", " ").trim(); + String serializedQuery = serializer + .apply(new GraphQLRequests(graphQLRequest1, graphQLRequest2, graphQLRequest21)).replaceAll(" +", " ") + .trim(); String expectedQueryStr = "query { " + "req1: eventsByCategoryAndStatus(status: OPEN){ id } " + "req2: eventsByCategoryAndStatus{ id status } " + @@ -428,7 +477,8 @@ void serialize_multipleRequests(String name, Function s @ParameterizedTest(name = "{0}") @MethodSource("provideStaticSerializerForMultiRequest") - void serialize_multipleRequests_DiffTypes(String name, Function serializer, Function expectedQueryDecorator) { + void serialize_multipleRequests_DiffTypes(String name, Function serializer, + Function expectedQueryDecorator) { GraphQLRequests graphQLRequests = new GraphQLRequests( new GraphQLRequest(new EventsByCategoryAndStatusQueryRequest()), new GraphQLRequest(new UpdateIssueMutationRequest())); @@ -438,7 +488,8 @@ void serialize_multipleRequests_DiffTypes(String name, Function serializer, Function expectedQueryDecorator) { + void serialize_multipleRequests_NullRequest(String name, Function serializer, + Function expectedQueryDecorator) { GraphQLRequests graphQLRequests = new GraphQLRequests( new GraphQLRequest(new EventsByCategoryAndStatusQueryRequest()), null); @@ -448,7 +499,8 @@ void serialize_multipleRequests_NullRequest(String name, Function serializer, Function expectedQueryDecorator) { + void serialize_multipleRequests_NullRequestRequest(String name, Function serializer, + Function expectedQueryDecorator) { GraphQLRequests graphQLRequests = new GraphQLRequests( new GraphQLRequest(new EventsByCategoryAndStatusQueryRequest()), new GraphQLRequest(null)); @@ -458,14 +510,11 @@ void serialize_multipleRequests_NullRequestRequest(String name, Function serializer, Function expectedQueryDecorator) { + void serialize_multipleRequests_NoRequests(String name, Function serializer, + Function expectedQueryDecorator) { GraphQLRequests graphQLRequests = new GraphQLRequests(); assertThrows(IllegalArgumentException.class, () -> serializer.apply(graphQLRequests)); } - private static String jsonQuery(String expectedQueryDecorator) { - return String.format("{\"query\":\"%s\"}", expectedQueryDecorator.replace("\\", "\\\\").replace("\"", "\\\"")); - } - } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLResultTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLResultTest.java index c84180ef1..47cfcc48b 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLResultTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/GraphQLResultTest.java @@ -13,6 +13,28 @@ class GraphQLResultTest { + private static GraphQLError getGraphQLErrorO() { + GraphQLErrorSourceLocation sourceLocation = new GraphQLErrorSourceLocation(); + sourceLocation.setColumn(4); + sourceLocation.setLine(5); + sourceLocation.setSourceName("6"); + GraphQLError graphQLError = new GraphQLError(); + graphQLError.setErrorType(GraphQLErrorType.ValidationError); + graphQLError.setExtensions(singletonMap("extKey", "extValue")); + graphQLError.setLocations(singletonList(sourceLocation)); + graphQLError.setMessage("something went wrong"); + graphQLError.setPath(singletonList("/order/items[0]/product")); + return graphQLError; + } + + private static GraphQLError getGraphQLError1() { + return new GraphQLError("something went very wrong", + singletonList(new GraphQLErrorSourceLocation(1, 2, "3")), + GraphQLErrorType.ExecutionAborted, + singletonList("/order/items[1]/product"), + singletonMap("extKey1", "extValue1")); + } + @Test void noErrorsEmpty() { assertFalse(new GraphQLResult<>(new UpdateIssueInput(), emptyList()).hasErrors()); @@ -51,26 +73,4 @@ void checkGetters() { assertEquals("extValue", graphQLError.getExtensions().get("extKey").toString()); } - private static GraphQLError getGraphQLErrorO() { - GraphQLErrorSourceLocation sourceLocation = new GraphQLErrorSourceLocation(); - sourceLocation.setColumn(4); - sourceLocation.setLine(5); - sourceLocation.setSourceName("6"); - GraphQLError graphQLError = new GraphQLError(); - graphQLError.setErrorType(GraphQLErrorType.ValidationError); - graphQLError.setExtensions(singletonMap("extKey", "extValue")); - graphQLError.setLocations(singletonList(sourceLocation)); - graphQLError.setMessage("something went wrong"); - graphQLError.setPath(singletonList("/order/items[0]/product")); - return graphQLError; - } - - private static GraphQLError getGraphQLError1() { - return new GraphQLError("something went very wrong", - singletonList(new GraphQLErrorSourceLocation(1, 2, "3")), - GraphQLErrorType.ExecutionAborted, - singletonList("/order/items[1]/product"), - singletonMap("extKey1", "extValue1")); - } - } \ No newline at end of file diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/EventPropertyParentParametrizedInput.java b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/EventPropertyParentParametrizedInput.java index f1e5a42b6..c07845db8 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/EventPropertyParentParametrizedInput.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/EventPropertyParentParametrizedInput.java @@ -2,8 +2,9 @@ import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLParametrizedInput; import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLRequestSerializer; -import java.util.StringJoiner; + import java.util.Objects; +import java.util.StringJoiner; /** * Parametrized input for field parent in type EventProperty diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/EventPropertyResponseProjection.java b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/EventPropertyResponseProjection.java index a26bd8348..8e23e057c 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/EventPropertyResponseProjection.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/EventPropertyResponseProjection.java @@ -56,11 +56,13 @@ public EventPropertyResponseProjection child(String alias, EventPropertyResponse return this; } - public EventPropertyResponseProjection child(EventPropertyChildParametrizedInput input, EventPropertyResponseProjection subProjection) { + public EventPropertyResponseProjection child(EventPropertyChildParametrizedInput input, + EventPropertyResponseProjection subProjection) { return child(null, input, subProjection); } - public EventPropertyResponseProjection child(String alias, EventPropertyChildParametrizedInput input, EventPropertyResponseProjection subProjection) { + public EventPropertyResponseProjection child(String alias, EventPropertyChildParametrizedInput input, + EventPropertyResponseProjection subProjection) { fields.add(new GraphQLResponseField("child").alias(alias).parameters(input).projection(subProjection)); return this; } @@ -74,11 +76,13 @@ public EventPropertyResponseProjection parent(String alias, EventResponseProject return this; } - public EventPropertyResponseProjection parent(EventPropertyParentParametrizedInput input, EventResponseProjection subProjection) { + public EventPropertyResponseProjection parent(EventPropertyParentParametrizedInput input, + EventResponseProjection subProjection) { return parent(null, input, subProjection); } - public EventPropertyResponseProjection parent(String alias, EventPropertyParentParametrizedInput input, EventResponseProjection subProjection) { + public EventPropertyResponseProjection parent(String alias, EventPropertyParentParametrizedInput input, + EventResponseProjection subProjection) { fields.add(new GraphQLResponseField("parent").alias(alias).parameters(input).projection(subProjection)); return this; } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/EventsByCategoryAndStatusQueryRequest.java b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/EventsByCategoryAndStatusQueryRequest.java index abe64b721..a6688e988 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/EventsByCategoryAndStatusQueryRequest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/EventsByCategoryAndStatusQueryRequest.java @@ -1,16 +1,21 @@ package com.kobylynskyi.graphql.codegen.model.graphql.data; -import java.util.*; -import com.kobylynskyi.graphql.codegen.model.graphql.*; +import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLOperation; +import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLOperationRequest; + +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Objects; +import java.util.Set; public class EventsByCategoryAndStatusQueryRequest implements GraphQLOperationRequest { private static final GraphQLOperation OPERATION_TYPE = GraphQLOperation.QUERY; private static final String OPERATION_NAME = "eventsByCategoryAndStatus"; - - private String alias; private final Map input = new LinkedHashMap<>(); private final Set useObjectMapperForInputSerialization = new HashSet<>(); + private String alias; public EventsByCategoryAndStatusQueryRequest() { } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/EventsByIdsQueryRequest.java b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/EventsByIdsQueryRequest.java index f9494be21..9964789d9 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/EventsByIdsQueryRequest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/EventsByIdsQueryRequest.java @@ -14,10 +14,9 @@ public class EventsByIdsQueryRequest implements GraphQLOperationRequest { private static final GraphQLOperation OPERATION_TYPE = GraphQLOperation.QUERY; private static final String OPERATION_NAME = "eventsByIds"; - - private String alias; private final Map input = new LinkedHashMap<>(); private final Set useObjectMapperForInputSerialization = new HashSet<>(); + private String alias; public EventsByIdsQueryRequest() { } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/UpdateDate2MutationRequest.java b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/UpdateDate2MutationRequest.java index 3ca513952..aad4443ac 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/UpdateDate2MutationRequest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/UpdateDate2MutationRequest.java @@ -13,10 +13,9 @@ public class UpdateDate2MutationRequest implements GraphQLOperationRequest { private static final GraphQLOperation OPERATION_TYPE = GraphQLOperation.MUTATION; private static final String OPERATION_NAME = "updateDate"; - - private String alias; private final Map input = new LinkedHashMap<>(); private final Set useObjectMapperForInputSerialization = new HashSet<>(); + private String alias; public UpdateDate2MutationRequest() { } @@ -25,11 +24,6 @@ public UpdateDate2MutationRequest(String alias) { this.alias = alias; } - public void setInput(ZonedDateTime input) { - this.input.put("input", input); - this.useObjectMapperForInputSerialization.add("input"); - } - @Override public GraphQLOperation getOperationType() { return OPERATION_TYPE; @@ -50,6 +44,11 @@ public Map getInput() { return input; } + public void setInput(ZonedDateTime input) { + this.input.put("input", input); + this.useObjectMapperForInputSerialization.add("input"); + } + @Override public Set getUseObjectMapperForInputSerialization() { return useObjectMapperForInputSerialization; diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/UpdateDateMutationRequest.java b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/UpdateDateMutationRequest.java index 869e5aa05..a89caff37 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/UpdateDateMutationRequest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/UpdateDateMutationRequest.java @@ -12,10 +12,9 @@ public class UpdateDateMutationRequest implements GraphQLOperationRequest { private static final GraphQLOperation OPERATION_TYPE = GraphQLOperation.MUTATION; private static final String OPERATION_NAME = "updateDate"; - - private String alias; private final Map input = new LinkedHashMap<>(); private final Set useObjectMapperForInputSerialization = new HashSet<>(); + private String alias; public UpdateDateMutationRequest() { } @@ -24,10 +23,6 @@ public UpdateDateMutationRequest(String alias) { this.alias = alias; } - public void setInput(DateInput input) { - this.input.put("input", input); - } - @Override public GraphQLOperation getOperationType() { return OPERATION_TYPE; @@ -48,4 +43,8 @@ public Map getInput() { return input; } + public void setInput(DateInput input) { + this.input.put("input", input); + } + } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/UpdateIssueInput.java b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/UpdateIssueInput.java index 15098d89e..c913d8373 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/UpdateIssueInput.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/UpdateIssueInput.java @@ -22,7 +22,8 @@ public UpdateIssueInput() { } public UpdateIssueInput(Double floatVal, Boolean booleanVal, Integer intVal, String stringVal, Status enumVal, - UpdateIssueInput objectWithNullDefault, Collection intList, Collection stringListEmptyDefault) { + UpdateIssueInput objectWithNullDefault, Collection intList, + Collection stringListEmptyDefault) { this.floatVal = floatVal; this.booleanVal = booleanVal; this.intVal = intVal; @@ -183,7 +184,8 @@ public Builder setStringListEmptyDefault(Collection stringListEmptyDefau } public UpdateIssueInput build() { - return new UpdateIssueInput(floatVal, booleanVal, intVal, stringVal, enumVal, objectWithNullDefault, intList, stringListEmptyDefault); + return new UpdateIssueInput(floatVal, booleanVal, intVal, stringVal, enumVal, objectWithNullDefault, + intList, stringListEmptyDefault); } } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/UpdateIssueMutationRequest.java b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/UpdateIssueMutationRequest.java index 27acd6766..cfa8b3f75 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/UpdateIssueMutationRequest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/UpdateIssueMutationRequest.java @@ -12,10 +12,9 @@ public class UpdateIssueMutationRequest implements GraphQLOperationRequest { private static final GraphQLOperation OPERATION_TYPE = GraphQLOperation.MUTATION; private static final String OPERATION_NAME = "updateIssue"; - - private String alias; private final Map input = new LinkedHashMap<>(); private final Set useObjectMapperForInputSerialization = new HashSet<>(); + private String alias; public UpdateIssueMutationRequest() { } @@ -24,10 +23,6 @@ public UpdateIssueMutationRequest(String alias) { this.alias = alias; } - public void setInput(UpdateIssueInput input) { - this.input.put("input", input); - } - @Override public GraphQLOperation getOperationType() { return OPERATION_TYPE; @@ -48,4 +43,8 @@ public Map getInput() { return input; } + public void setInput(UpdateIssueInput input) { + this.input.put("input", input); + } + } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/UpdateNodeUnionResponseProjection.java b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/UpdateNodeUnionResponseProjection.java index ff799ba42..7103f6063 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/UpdateNodeUnionResponseProjection.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/UpdateNodeUnionResponseProjection.java @@ -24,7 +24,8 @@ public UpdateNodeUnionResponseProjection onOrganization(OrganizationResponseProj return onOrganization(null, subProjection); } - public UpdateNodeUnionResponseProjection onOrganization(String alias, OrganizationResponseProjection subProjection) { + public UpdateNodeUnionResponseProjection onOrganization(String alias, + OrganizationResponseProjection subProjection) { fields.add(new GraphQLResponseField("...on Organization").alias(alias).projection(subProjection)); return this; } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/VersionQueryRequest.java b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/VersionQueryRequest.java index b275eb46e..5a8bf8782 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/VersionQueryRequest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/model/graphql/data/VersionQueryRequest.java @@ -13,10 +13,9 @@ public class VersionQueryRequest implements GraphQLOperationRequest { private static final GraphQLOperation OPERATION_TYPE = GraphQLOperation.QUERY; private static final String OPERATION_NAME = "version"; - - private String alias; private final Map input = new LinkedHashMap<>(); private final Set useObjectMapperForInputSerialization = new HashSet<>(); + private String alias; public VersionQueryRequest() { } @@ -25,6 +24,10 @@ public VersionQueryRequest(String alias) { this.alias = alias; } + public static Builder builder() { + return new Builder(); + } + @Override public GraphQLOperation getOperationType() { return OPERATION_TYPE; @@ -55,10 +58,6 @@ public String toString() { return Objects.toString(input); } - public static Builder builder() { - return new Builder(); - } - public static class Builder { diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenAnnotationsTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenAnnotationsTest.java index c86a58cec..91c545a5d 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenAnnotationsTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenAnnotationsTest.java @@ -43,16 +43,22 @@ void cleanup() { @Test void generate_CustomAnnotationMappings() throws Exception { - mappingConfig.setCustomTypesMapping(new HashMap<>(singletonMap("Event.createdDateTime", "org.joda.time.DateTime"))); + mappingConfig + .setCustomTypesMapping(new HashMap<>(singletonMap("Event.createdDateTime", "org.joda.time.DateTime"))); mappingConfig.setCustomAnnotationsMapping(new HashMap<>(singletonMap("Event.createdDateTime", - singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = classOf[com.example.json.DateTimeScalarDeserializer])")))); + singletonList( + "@com.fasterxml.jackson.databind" + + ".annotation.JsonDeserialize(using =" + + " classOf[com.example.json" + + ".DateTimeScalarDeserializer])")))); new ScalaGraphQLCodegen(singletonList("src/test/resources/schemas/test.graphqls"), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertFileContainsElements(files, "Event.scala", - " @com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = classOf[com.example.json.DateTimeScalarDeserializer])\n" + + " @com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = " + + "classOf[com.example.json.DateTimeScalarDeserializer])\n" + " createdDateTime: org.joda.time.DateTime,"); } @@ -60,15 +66,23 @@ void generate_CustomAnnotationMappings() throws Exception { void generate_CustomAnnotationMappings_Class() throws Exception { Map> customAnnotationsMapping = new HashMap<>(); // input - customAnnotationsMapping.put("AcceptTopicSuggestionInput", singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = classOf[AcceptTopicSuggestionInputDeserializer])")); + customAnnotationsMapping.put("AcceptTopicSuggestionInput", singletonList( + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = " + + "classOf[AcceptTopicSuggestionInputDeserializer])")); // type - customAnnotationsMapping.put("AcceptTopicSuggestionPayload", singletonList("com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = classOf[AcceptTopicSuggestionPayloadDeserializer])")); + customAnnotationsMapping.put("AcceptTopicSuggestionPayload", singletonList( + "com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = " + + "classOf[AcceptTopicSuggestionPayloadDeserializer])")); // interface - customAnnotationsMapping.put("Actor", singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = classOf[ActorDeserializer])")); + customAnnotationsMapping.put("Actor", singletonList( + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = classOf[ActorDeserializer])")); // union - customAnnotationsMapping.put("Assignee", singletonList("com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = classOf[AssigneeDeserializer])")); + customAnnotationsMapping.put("Assignee", singletonList( + "com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = classOf[AssigneeDeserializer])")); // enum - customAnnotationsMapping.put("DeploymentOrderField", singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = classOf[DeploymentOrderFieldDeserializer])")); + customAnnotationsMapping.put("DeploymentOrderField", singletonList( + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = " + + "classOf[DeploymentOrderFieldDeserializer])")); mappingConfig.setCustomAnnotationsMapping(customAnnotationsMapping); new ScalaGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), @@ -76,19 +90,24 @@ void generate_CustomAnnotationMappings_Class() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertFileContainsElements(files, "AcceptTopicSuggestionInput.scala", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = classOf[AcceptTopicSuggestionInputDeserializer])\n" + + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = " + + "classOf[AcceptTopicSuggestionInputDeserializer])\n" + "case class AcceptTopicSuggestionInput"); assertFileContainsElements(files, "AcceptTopicSuggestionPayload.scala", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = classOf[AcceptTopicSuggestionPayloadDeserializer])\n" + + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = " + + "classOf[AcceptTopicSuggestionPayloadDeserializer])\n" + "case class AcceptTopicSuggestionPayload"); assertFileContainsElements(files, "Actor.scala", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = classOf[ActorDeserializer])\n" + + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = " + + "classOf[ActorDeserializer])\n" + "trait Actor"); assertFileContainsElements(files, "Assignee.scala", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = classOf[AssigneeDeserializer])\n" + + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = " + + "classOf[AssigneeDeserializer])\n" + "trait Assignee"); assertFileContainsElements(files, "DeploymentOrderField.scala", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = classOf[DeploymentOrderFieldDeserializer])\n" + + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = " + + "classOf[DeploymentOrderFieldDeserializer])\n" + "object DeploymentOrderField extends Enumeration"); } @@ -97,26 +116,35 @@ void generate_CustomAnnotationMappings_Multiple() throws Exception { Map> customAnnotationsMapping = new HashMap<>(); // type customAnnotationsMapping.put("AcceptTopicSuggestionPayload", Arrays.asList( - "@com.fasterxml.jackson.annotation.JsonTypeInfo(use = com.fasterxml.jackson.annotation.JsonTypeInfo.Id.NAME, property = \"__typename\")", - "@com.fasterxml.jackson.databind.annotation.JsonTypeIdResolver(classOf[io.github.kobylynskyi.order.external.starwars.AcceptTopicSuggestionPayloadTypeResolver])")); + "@com.fasterxml.jackson.annotation.JsonTypeInfo(use = com.fasterxml.jackson.annotation.JsonTypeInfo.Id" + + ".NAME, property = \"__typename\")", + "@com.fasterxml.jackson.databind.annotation.JsonTypeIdResolver(classOf[io.github.kobylynskyi.order" + + ".external.starwars.AcceptTopicSuggestionPayloadTypeResolver])")); mappingConfig.setCustomAnnotationsMapping(customAnnotationsMapping); new ScalaGraphQLCodegen(singletonList("src/test/resources/schemas/github.graphqls"), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertFileContainsElements(files, "AcceptTopicSuggestionPayload.scala", "@com.fasterxml.jackson.annotation.JsonTypeInfo(use = com.fasterxml.jackson.annotation.JsonTypeInfo.Id.NAME, property = \"__typename\")\n" + - "@com.fasterxml.jackson.databind.annotation.JsonTypeIdResolver(classOf[io.github.kobylynskyi.order.external.starwars.AcceptTopicSuggestionPayloadTypeResolver])\n" + - "case class AcceptTopicSuggestionPayload"); + assertFileContainsElements(files, "AcceptTopicSuggestionPayload.scala", + "@com.fasterxml.jackson.annotation.JsonTypeInfo(use = com.fasterxml.jackson" + + ".annotation.JsonTypeInfo.Id.NAME, property = \"__typename\")\n" + + "@com.fasterxml.jackson.databind.annotation.JsonTypeIdResolver(classOf[io.github" + + ".kobylynskyi.order.external.starwars.AcceptTopicSuggestionPayloadTypeResolver])\n" + + "case class AcceptTopicSuggestionPayload"); } @Test void generate_CustomAnnotationMappings_RequestResponseClasses() throws Exception { Map> customAnnotationsMapping = new HashMap<>(); // request - customAnnotationsMapping.put("CodeOfConductQueryRequest", singletonList("@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = classOf[CodeOfConductQueryRequestDeserializer])")); + customAnnotationsMapping.put("CodeOfConductQueryRequest", singletonList( + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = " + + "classOf[CodeOfConductQueryRequestDeserializer])")); // response - customAnnotationsMapping.put("CodeOfConductQueryResponse", singletonList("com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = classOf[CodeOfConductQueryResponseDeserializer])")); + customAnnotationsMapping.put("CodeOfConductQueryResponse", singletonList( + "com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = " + + "classOf[CodeOfConductQueryResponseDeserializer])")); mappingConfig.setCustomAnnotationsMapping(customAnnotationsMapping); mappingConfig.setGenerateClient(true); @@ -125,18 +153,24 @@ void generate_CustomAnnotationMappings_RequestResponseClasses() throws Exception File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertFileContainsElements(files, "CodeOfConductQueryRequest.scala", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = classOf[CodeOfConductQueryRequestDeserializer])\n" + + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = " + + "classOf[CodeOfConductQueryRequestDeserializer])\n" + "class CodeOfConductQueryRequest"); assertFileContainsElements(files, "CodeOfConductQueryResponse.scala", - "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = classOf[CodeOfConductQueryResponseDeserializer])\n" + - "class CodeOfConductQueryResponse extends GraphQLResult[JMap[String, CodeOfConduct]]"); + "@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = " + + "classOf[CodeOfConductQueryResponseDeserializer])\n" + + "class CodeOfConductQueryResponse extends GraphQLResult[JMap[String, " + + "CodeOfConduct]]"); } @Test void generate_Directives() throws Exception { Map> directiveAnnotationsMapping = new HashMap<>(); directiveAnnotationsMapping.put("auth", - singletonList("@com.example.CustomAnnotation(roles={{roles?toArray}}, boo={{boo?toArray}}, float={{float?toArrayOfStrings}}, int={{int}}, n={{n?toString}})")); + singletonList( + "@com.example.CustomAnnotation(roles={{roles?toArray}}, " + + "boo={{boo?toArray}}, float={{float?toArrayOfStrings}}, int={{int}}, " + + "n={{n?toString}})")); mappingConfig.setDirectiveAnnotationsMapping(directiveAnnotationsMapping); new ScalaGraphQLCodegen(singletonList("src/test/resources/schemas/test.graphqls"), diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenCustomScalarMappingTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenCustomScalarMappingTest.java index cd8fd670e..edfd19d0d 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenCustomScalarMappingTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenCustomScalarMappingTest.java @@ -1,7 +1,6 @@ package com.kobylynskyi.graphql.codegen.scala; import com.kobylynskyi.graphql.codegen.TestUtils; -import com.kobylynskyi.graphql.codegen.java.JavaGraphQLCodegen; import com.kobylynskyi.graphql.codegen.model.GeneratedLanguage; import com.kobylynskyi.graphql.codegen.model.MappingConfig; import com.kobylynskyi.graphql.codegen.utils.Utils; @@ -15,7 +14,9 @@ import static com.kobylynskyi.graphql.codegen.TestUtils.assertSameTrimmedContent; import static com.kobylynskyi.graphql.codegen.TestUtils.getFileByName; -import static java.util.Collections.*; +import static java.util.Collections.singleton; +import static java.util.Collections.singletonList; +import static java.util.Collections.singletonMap; class GraphQLCodegenCustomScalarMappingTest { @@ -48,7 +49,8 @@ void generate_CustomTypeMapping_WholeScalar() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertSameTrimmedContent( - new File("src/test/resources/expected-classes/scala/custom-type/QueryINeedQueryRequest_whole_scalar.scala.txt"), + new File("src/test/resources/expected-classes/scala/custom-type/" + + "QueryINeedQueryRequest_whole_scalar.scala.txt"), getFileByName(files, "QueryINeedQueryRequest.scala")); } @@ -84,7 +86,9 @@ void generate_UseObjectMapperToSerializeFields_Parameter() throws Exception { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/scala/QueryINeedQueryRequest_custom_serializer.scala.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/scala/" + + "QueryINeedQueryRequest_custom_serializer.scala.txt"), getFileByName(files, "QueryINeedQueryRequest.scala")); } } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenDeprecatedTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenDeprecatedTest.java index aa9057d72..37c0828a8 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenDeprecatedTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenDeprecatedTest.java @@ -39,16 +39,20 @@ void cleanup() { @Test void generate_deprecated() throws Exception { - new ScalaGraphQLCodegen(Collections.singletonList("src/test/resources/schemas/deprecated-with-msg.graphqls"), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + new ScalaGraphQLCodegen(Collections.singletonList("src/test/resources/schemas/deprecated-with-msg.graphqls"), + outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); List generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList()); - assertEquals(Arrays.asList("CreateEventMutationResolver.scala", "Event.scala", "EventInput.scala", "EventsQueryResolver.scala", - "MutationResolver.scala", "Node.scala", "PinnableItem.scala", "QueryResolver.scala", "Status.scala"), generatedFileNames); + assertEquals(Arrays.asList("CreateEventMutationResolver.scala", "Event.scala", "EventInput.scala", + "EventsQueryResolver.scala", + "MutationResolver.scala", "Node.scala", "PinnableItem.scala", "QueryResolver.scala", + "Status.scala"), generatedFileNames); for (File file : files) { assertSameTrimmedContent( - new File(String.format("src/test/resources/expected-classes/scala/deprecated/%s.txt", file.getName())), + new File(String.format("src/test/resources/expected-classes/scala/deprecated/%s.txt", + file.getName())), file); } } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenEmptyTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenEmptyTest.java index bddbed4ed..e23c86c10 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenEmptyTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenEmptyTest.java @@ -43,12 +43,14 @@ void cleanup() { @Test void generateServerSideClasses() throws Exception { - new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); assertEquals(new HashSet<>(asList("Node.scala", "Event.scala", "MutationResolver.scala", - "EventInput.scala", "QueryResolver.scala", "Status.scala", "PinnableItem.scala")), + "EventInput.scala", "QueryResolver.scala", "Status.scala", + "PinnableItem.scala")), generatedFileNames); for (File file : files) { @@ -62,7 +64,8 @@ void generateServerSideClasses() throws Exception { void generateClientSideClasses() throws Exception { mappingConfig.setGenerateApis(false); mappingConfig.setGenerateClient(true); - new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + new JavaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenExtendTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenExtendTest.java index 52b680ed2..cad60cdf5 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenExtendTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenExtendTest.java @@ -11,7 +11,12 @@ import java.io.File; import java.nio.file.Paths; -import java.util.*; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Objects; +import java.util.Set; import static com.kobylynskyi.graphql.codegen.TestUtils.assertSameTrimmedContent; import static com.kobylynskyi.graphql.codegen.TestUtils.getFileByName; @@ -39,7 +44,8 @@ void cleanup() { @Test void generateServerSideClasses() throws Exception { - new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); @@ -60,7 +66,8 @@ void generateServerSideClasses() throws Exception { void generateServerSideClasses_ExtensionFieldsResolvers_WithExclusions() throws Exception { mappingConfig.setGenerateExtensionFieldsResolvers(true); mappingConfig.setFieldsWithoutResolvers(new HashSet<>(asList("Node", "Event.assets"))); - new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); @@ -81,7 +88,8 @@ void generateServerSideClasses_ExtensionFieldsResolvers_WithExclusions() throws @Test void generateServerSideClasses_EmptyTypes() throws Exception { schemaFinder.setIncludePattern("empty-types-with-extend\\.graphqls"); - new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); @@ -102,7 +110,8 @@ void generateServerSideClasses_EmptyTypes() throws Exception { void generateClientSideClasses() throws Exception { mappingConfig.setGenerateApis(false); mappingConfig.setGenerateClient(true); - new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -120,24 +129,30 @@ void generatePrimitiveTypesResponseResolverClasses() throws Exception { mappingConfig.setGenerateApis(true); mappingConfig.setGenerateClient(true); schemaFinder.setIncludePattern("null-extend1.graphqls"); - new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); assertSameTrimmedContent( - new File("src/test/resources/expected-classes/scala/extend/resolver/SimpleEventCountsQueryResponse.scala.txt"), + new File("src/test/resources/expected-classes/scala/extend/resolver/" + + "SimpleEventCountsQueryResponse.scala.txt"), getFileByName(files, "SimpleEventCountsQueryResponse.scala")); assertSameTrimmedContent( - new File("src/test/resources/expected-classes/scala/extend/resolver/SimpleEventCountsQueryResolver.scala.txt"), + new File("src/test/resources/expected-classes/scala/extend/resolver/" + + "SimpleEventCountsQueryResolver.scala.txt"), getFileByName(files, "SimpleEventCountsQueryResolver.scala")); assertSameTrimmedContent( - new File("src/test/resources/expected-classes/scala/extend/resolver/SimpleEventCountQueryResolver.scala.txt"), + new File("src/test/resources/expected-classes/scala/extend/resolver/" + + "SimpleEventCountQueryResolver.scala.txt"), getFileByName(files, "SimpleEventCountQueryResolver.scala")); assertSameTrimmedContent( - new File("src/test/resources/expected-classes/scala/extend/resolver/SimpleEventCountQueryResponse.scala.txt"), + new File( + "src/test/resources/expected-classes/scala/extend/resolver/" + + "SimpleEventCountQueryResponse.scala.txt"), getFileByName(files, "SimpleEventCountQueryResponse.scala")); } @@ -145,10 +160,12 @@ void generatePrimitiveTypesResponseResolverClasses() throws Exception { void generatePrimitiveTypesResponseResolverClasses_With_SetUseOptionalForNullableReturnTypes() throws Exception { mappingConfig.setGenerateApis(true); mappingConfig.setGenerateClient(true); - //Therefore, when the return type is a primitive type, the return option is automatically turned on, and this is mandatory. + //Therefore, when the return type is a primitive type, the return option is automatically turned on, and this + // is mandatory. mappingConfig.setUseOptionalForNullableReturnTypes(true); schemaFinder.setIncludePattern("null-extend2.graphqls"); - new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -167,20 +184,25 @@ void generatePrimitiveTypesResponseResolverClasses_Without_SetUseOptionalForNull mappingConfig.setGenerateClient(true); mappingConfig.setUseOptionalForNullableReturnTypes(false); schemaFinder.setIncludePattern("null-extend2.graphqls"); - new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - //Therefore, when the return type is a primitive type, the return option is automatically turned on, and this is mandatory. + //Therefore, when the return type is a primitive type, the return option is automatically turned on, and this + // is mandatory. assertSameTrimmedContent( - new File("src/test/resources/expected-classes/scala/extend/nullreturn/SimpleEventCountQueryResolver.scala.txt"), + new File("src/test/resources/expected-classes/scala/extend/nullreturn/" + + "SimpleEventCountQueryResolver.scala.txt"), getFileByName(files, "SimpleEventCountQueryResolver.scala")); assertSameTrimmedContent( - new File("src/test/resources/expected-classes/scala/extend/nullreturn/SimpleEventCountsQueryResolver.scala.txt"), + new File("src/test/resources/expected-classes/scala/extend/nullreturn/" + + "SimpleEventCountsQueryResolver.scala.txt"), getFileByName(files, "SimpleEventCountsQueryResolver.scala")); assertSameTrimmedContent( - new File("src/test/resources/expected-classes/scala/extend/nullreturn/SimplesQueryResolver_without_option.scala.txt"), + new File("src/test/resources/expected-classes/scala/extend/nullreturn/" + + "SimplesQueryResolver_without_option.scala.txt"), getFileByName(files, "SimplesQueryResolver.scala")); } @@ -190,7 +212,8 @@ void generatePrimitiveTypesResponseResolverClasses_nullable() throws Exception { mappingConfig.setGenerateClient(true); mappingConfig.setUseOptionalForNullableReturnTypes(true); schemaFinder.setIncludePattern("null-extend3.graphqls"); - new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); @@ -225,18 +248,21 @@ void generate_OptionalFieldInInterfaceAndMandatoryInType() throws Exception { mappingConfig.setGenerateToString(true); mappingConfig.setGenerateEqualsAndHashCode(true); Map maps = new HashMap<>(); - maps.put("Int", "Int");// Now, That's the only way to do it. + maps.put("Int", "Int"); // Now, That's the only way to do it. mappingConfig.setCustomTypesMapping(maps); schemaFinder.setIncludePattern("optional-vs-mandatory-types.graphqls"); - new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()) + new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()) .generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/scala/optional/InterfaceWithOptionalField.scala.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/scala/optional/InterfaceWithOptionalField.scala.txt"), getFileByName(files, "InterfaceWithOptionalField.scala")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/scala/optional/TypeWithMandatoryField.scala.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/scala/optional/TypeWithMandatoryField.scala.txt"), getFileByName(files, "TypeWithMandatoryField.scala")); } } \ No newline at end of file diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenGitHubTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenGitHubTest.java index 0556513f1..4d8f9cdef 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenGitHubTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenGitHubTest.java @@ -1,6 +1,5 @@ package com.kobylynskyi.graphql.codegen.scala; -import com.kobylynskyi.graphql.codegen.GraphQLCodegen; import com.kobylynskyi.graphql.codegen.TestUtils; import com.kobylynskyi.graphql.codegen.model.GeneratedLanguage; import com.kobylynskyi.graphql.codegen.model.MappingConfig; @@ -25,6 +24,10 @@ class GraphQLCodegenGitHubTest { private final File outputScalaClassesDir = new File("build/generated/com/github/graphql"); private final MappingConfig mappingConfig = new MappingConfig(); + private static String getFileContent(File[] files, String fileName) throws IOException { + return Utils.getFileContent(getFileByName(files, fileName).getPath()); + } + @BeforeEach void init() { mappingConfig.setGenerateParameterizedFieldsResolvers(false); @@ -97,7 +100,8 @@ void generate_NoValidationAnnotation() throws Exception { outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); File commitFile = getFileByName(Objects.requireNonNull(outputScalaClassesDir.listFiles()), "Commit.scala"); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/scala/Commit_noValidationAnnotation.scala.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/scala/Commit_noValidationAnnotation.scala.txt"), commitFile); } @@ -110,9 +114,12 @@ void generate_Client_ConditionalFragments() throws Exception { outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputScalaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/scala/SearchResultItemConnectionResponseProjection.scala.txt"), + assertSameTrimmedContent(new File( + "src/test/resources/expected-classes/scala" + + "/SearchResultItemConnectionResponseProjection.scala.txt"), getFileByName(files, "SearchResultItemConnectionResponseProjection.scala")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/scala/SearchResultItemResponseProjection.scala.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/scala/SearchResultItemResponseProjection.scala.txt"), getFileByName(files, "SearchResultItemResponseProjection.scala")); } @@ -127,7 +134,8 @@ void generate_NoPrimitives() throws Exception { outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputScalaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/scala/Commit_withoutPrimitives.scala.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/scala/Commit_withoutPrimitives.scala.txt"), getFileByName(files, "Commit.scala")); } @@ -146,10 +154,6 @@ void generate_Primitives() throws Exception { getFileByName(files, "Commit.scala")); } - private static String getFileContent(File[] files, String fileName) throws IOException { - return Utils.getFileContent(getFileByName(files, fileName).getPath()); - } - @Test void generate_ResponseWithPrimitiveType() throws Exception { mappingConfig.putCustomTypeMappingIfAbsent("Int!", "Int"); @@ -159,7 +163,8 @@ void generate_ResponseWithPrimitiveType() throws Exception { File[] files = Objects.requireNonNull(outputScalaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/scala/VersionQueryResponse_int.scala.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/scala/VersionQueryResponse_int.scala.txt"), getFileByName(files, "VersionQueryResponse.scala")); } @@ -169,18 +174,24 @@ void generate_ScalaList() throws Exception { outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputScalaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/scala/AddLabelsToLabelableInput.scala.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/scala/AddLabelsToLabelableInput.scala.txt"), getFileByName(files, "AddLabelsToLabelableInput.scala")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/scala/AddLabelsToLabelableMutationRequest.scala.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/scala/AddLabelsToLabelableMutationRequest.scala.txt"), getFileByName(files, "AddLabelsToLabelableMutationRequest.scala")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/scala/AddLabelsToLabelableMutationResolver.scala.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/scala/AddLabelsToLabelableMutationResolver.scala.txt"), getFileByName(files, "AddLabelsToLabelableMutationResolver.scala")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/scala/AddLabelsToLabelableMutationResponse.scala.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/scala/AddLabelsToLabelableMutationResponse.scala.txt"), getFileByName(files, "AddLabelsToLabelableMutationResponse.scala")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/scala/AddLabelsToLabelablePayload.scala.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/scala/AddLabelsToLabelablePayload.scala.txt"), getFileByName(files, "AddLabelsToLabelablePayload.scala")); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/scala/CodesOfConductQueryResolver.scala.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/scala/CodesOfConductQueryResolver.scala.txt"), getFileByName(files, "CodesOfConductQueryResolver.scala")); } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenReactorToStringTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenReactorToStringTest.java index c7fef53b3..f5d0cd588 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenReactorToStringTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenReactorToStringTest.java @@ -37,9 +37,10 @@ public void setup() { } @Test - void generate_SetGenerateBuilder_FALSE() throws Exception { + void generate_SetGenerateBuilder_False() throws Exception { mappingConfig.setPackageName("com.kobylynskyi.graphql.codegen.prot"); - mappingConfig.setGenerateBuilder(false);// fix bug when, set generate builder = false, can not use object.OPERATION_NAME, + // fix an issue when generateBuilder=false => can not use object.OPERATION_NAME + mappingConfig.setGenerateBuilder(false); mappingConfig.setGenerateEqualsAndHashCode(true); mappingConfig.setGenerateClient(true); mappingConfig.setGenerateModelsForRootTypes(true); @@ -48,7 +49,9 @@ void generate_SetGenerateBuilder_FALSE() throws Exception { outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - List generatedFileNames = Arrays.stream(files).map(File::getName).filter(f -> f.equals("CaseQueryRequest.scala")).sorted().collect(toList()); + List generatedFileNames = Arrays.stream(files).map(File::getName) + .filter(f -> f.equals("CaseQueryRequest.scala")).sorted() + .collect(toList()); assertEquals(singletonList("CaseQueryRequest.scala"), generatedFileNames); for (File file : files) { @@ -60,7 +63,7 @@ void generate_SetGenerateBuilder_FALSE() throws Exception { } @Test - void generate_SetGenerateClient_TRUE() throws Exception { + void generate_SetGenerateClient_True() throws Exception { mappingConfig.setPackageName("com.kobylynskyi.graphql.codegen.prot"); mappingConfig.setGenerateEqualsAndHashCode(true); mappingConfig.setGenerateClient(true); @@ -75,13 +78,16 @@ void generate_SetGenerateClient_TRUE() throws Exception { outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - List generatedFileNames = Arrays.stream(files).map(File::getName).filter(f -> Arrays.asList("QueryPrivateParametrizedInput.scala", "Synchronized.scala").contains(f)).sorted().collect(toList()); + List generatedFileNames = Arrays.stream(files).map(File::getName).filter( + f -> Arrays.asList("QueryPrivateParametrizedInput.scala", "Synchronized.scala").contains(f)).sorted() + .collect(toList()); assertEquals(Arrays.asList("QueryPrivateParametrizedInput.scala", "Synchronized.scala"), generatedFileNames); for (File file : files) { if (Arrays.asList("QueryPrivateParametrizedInput.scala", "Synchronized.scala").contains(file.getName())) { assertSameTrimmedContent( - new File(String.format("src/test/resources/expected-classes/scala/tostring/%s.txt", file.getName())), + new File(String.format("src/test/resources/expected-classes/scala/tostring/%s.txt", + file.getName())), file); } } @@ -103,14 +109,17 @@ void generate_SetGenerateClient_False() throws Exception { outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - List generatedFileNames = Arrays.stream(files).map(File::getName).filter(f -> Objects.equals("Synchronized.scala", f) - || Objects.equals("QueryCaseParametrizedInput.scala", f)).sorted().collect(toList()); + List generatedFileNames = Arrays.stream(files).map(File::getName) + .filter(f -> Objects.equals("Synchronized.scala", f) + || Objects.equals("QueryCaseParametrizedInput.scala", f)) + .sorted().collect(toList()); assertEquals(singletonList("Synchronized.scala"), generatedFileNames); for (File file : files) { if (Arrays.asList("QueryCaseParametrizedInput.scala", "Synchronized.scala").contains(file.getName())) { assertSameTrimmedContent( - new File(String.format("src/test/resources/expected-classes/scala/tostring/%s.txt", "TOSTRING_Synchronized.scala", + new File(String.format("src/test/resources/expected-classes/scala/tostring/%s.txt", + "TOSTRING_Synchronized.scala", "QueryCaseParametrizedInput")), file); } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenRelayTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenRelayTest.java index 57f978299..d2dd0c9aa 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenRelayTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/scala/GraphQLCodegenRelayTest.java @@ -43,7 +43,8 @@ void cleanup() { @Test void generateServerSideRelayClasses() throws Exception { - new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); Set generatedFileNames = Arrays.stream(files).map(File::getName).collect(toSet()); @@ -61,11 +62,13 @@ void generateServerSideRelayClasses() throws Exception { void generateServerSideRelayClasses_CustomGenericsConnectionType() throws Exception { mappingConfig.getRelayConfig() .setConnectionType("reactor.core.publisher.Mono[graphql.relay.Connection[%s]]"); - new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + new ScalaGraphQLCodegen(schemaFinder.findSchemas(), outputBuildDir, mappingConfig, + TestUtils.getStaticGeneratedInfo()).generate(); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); - assertSameTrimmedContent(new File("src/test/resources/expected-classes/scala/relay/UsersQueryResolver_reactive.scala.txt"), + assertSameTrimmedContent( + new File("src/test/resources/expected-classes/scala/relay/UsersQueryResolver_reactive.scala.txt"), getFileByName(files, "UsersQueryResolver.scala")); } diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/supplier/JsonMappingConfigSupplierTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/supplier/JsonMappingConfigSupplierTest.java index 055120fdb..554692662 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/supplier/JsonMappingConfigSupplierTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/supplier/JsonMappingConfigSupplierTest.java @@ -12,7 +12,8 @@ class JsonMappingConfigSupplierTest { @Test void loadCorrect() { - MappingConfig externalMappingConfig = new JsonMappingConfigSupplier("src/test/resources/json/mappingconfig.json").get(); + MappingConfig externalMappingConfig = new JsonMappingConfigSupplier( + "src/test/resources/json/mappingconfig.json").get(); assertEquals("com.kobylynskyi.graphql.testconfigjson", externalMappingConfig.getPackageName()); assertTrue(externalMappingConfig.getGenerateApis()); assertEquals("java.math.BigDecimal", externalMappingConfig.getCustomTypesMapping().get("Price.amount")); diff --git a/src/test/resources/expected-classes/scala/AddLabelsToLabelableInput.scala.txt b/src/test/resources/expected-classes/scala/AddLabelsToLabelableInput.scala.txt index 179ac9ca4..1aa51c68b 100644 --- a/src/test/resources/expected-classes/scala/AddLabelsToLabelableInput.scala.txt +++ b/src/test/resources/expected-classes/scala/AddLabelsToLabelableInput.scala.txt @@ -10,13 +10,13 @@ import scala.collection.JavaConverters._ case class AddLabelsToLabelableInput( clientMutationId: String, @javax.validation.constraints.NotNull - labelIds: Seq[String], + labelIds: scala.Seq[String], @javax.validation.constraints.NotNull labelableId: String ) { override def toString(): String = { - Seq( + scala.Seq( if (clientMutationId != null) "clientMutationId: " + GraphQLRequestSerializer.getEntry(clientMutationId) else "", if (labelIds != null) "labelIds: " + GraphQLRequestSerializer.getEntry(labelIds.asJava) else "", if (labelableId != null) "labelableId: " + GraphQLRequestSerializer.getEntry(labelableId) else "" diff --git a/src/test/resources/expected-classes/scala/AddLabelsToLabelableMutationRequest.scala.txt b/src/test/resources/expected-classes/scala/AddLabelsToLabelableMutationRequest.scala.txt index f7d6d9097..b54492707 100644 --- a/src/test/resources/expected-classes/scala/AddLabelsToLabelableMutationRequest.scala.txt +++ b/src/test/resources/expected-classes/scala/AddLabelsToLabelableMutationRequest.scala.txt @@ -3,7 +3,7 @@ package com.github.graphql import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLOperation import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLOperationRequest import java.util.{ LinkedHashMap => JLinkedHashMap } -import java.util.{ Map => JMap } +import java.util.{ Map => JMap, Set => JSet } import java.util.Objects import scala.collection.mutable import scala.collection.JavaConverters._ @@ -29,7 +29,7 @@ class AddLabelsToLabelableMutationRequest(alias: String) extends GraphQLOperatio override def getInput(): JMap[String, java.lang.Object] = input - override def getUseObjectMapperForInputSerialization(): java.util.Set[String] = useObjectMapperForInputSerialization.asJava + override def getUseObjectMapperForInputSerialization(): JSet[String] = useObjectMapperForInputSerialization.asJava override def equals(obj: Any): Boolean = { if (this == obj) { diff --git a/src/test/resources/expected-classes/scala/AddLabelsToLabelablePayload.scala.txt b/src/test/resources/expected-classes/scala/AddLabelsToLabelablePayload.scala.txt index 82f585ed0..4ead411df 100644 --- a/src/test/resources/expected-classes/scala/AddLabelsToLabelablePayload.scala.txt +++ b/src/test/resources/expected-classes/scala/AddLabelsToLabelablePayload.scala.txt @@ -13,7 +13,7 @@ case class AddLabelsToLabelablePayload( ) { override def toString(): String = { - Seq( + scala.Seq( if (clientMutationId != null) "clientMutationId: " + GraphQLRequestSerializer.getEntry(clientMutationId) else "", if (labelable != null) "labelable: " + GraphQLRequestSerializer.getEntry(labelable) else "" ).filter(_ != "").mkString("{", ",", "}") diff --git a/src/test/resources/expected-classes/scala/CodesOfConductQueryResolver.scala.txt b/src/test/resources/expected-classes/scala/CodesOfConductQueryResolver.scala.txt index 274b692e8..7ed324ac9 100644 --- a/src/test/resources/expected-classes/scala/CodesOfConductQueryResolver.scala.txt +++ b/src/test/resources/expected-classes/scala/CodesOfConductQueryResolver.scala.txt @@ -8,6 +8,6 @@ package com.github.graphql trait CodesOfConductQueryResolver { @throws[Exception] - def codesOfConduct(): Seq[CodeOfConduct] + def codesOfConduct(): scala.Seq[CodeOfConduct] } \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/Commit.scala.txt b/src/test/resources/expected-classes/scala/Commit.scala.txt index 3cffca61a..f8070c4ab 100644 --- a/src/test/resources/expected-classes/scala/Commit.scala.txt +++ b/src/test/resources/expected-classes/scala/Commit.scala.txt @@ -74,7 +74,7 @@ case class Commit( ) extends Closer with IssueTimelineItem with PullRequestTimelineItem with Subscribable with Node with GitObject with UniformResourceLocatable { override def toString(): String = { - Seq( + scala.Seq( if (abbreviatedOid != null) "abbreviatedOid: " + GraphQLRequestSerializer.getEntry(abbreviatedOid) else "", "additions: " + GraphQLRequestSerializer.getEntry(additions), if (associatedPullRequests != null) "associatedPullRequests: " + GraphQLRequestSerializer.getEntry(associatedPullRequests) else "", diff --git a/src/test/resources/expected-classes/scala/Commit_Var_Field.scala.txt b/src/test/resources/expected-classes/scala/Commit_Var_Field.scala.txt index 5684f4e1b..b88b4d4c4 100644 --- a/src/test/resources/expected-classes/scala/Commit_Var_Field.scala.txt +++ b/src/test/resources/expected-classes/scala/Commit_Var_Field.scala.txt @@ -74,7 +74,7 @@ case class Commit( ) extends Closer with IssueTimelineItem with PullRequestTimelineItem with Subscribable with Node with GitObject with UniformResourceLocatable { override def toString(): String = { - Seq( + scala.Seq( if (abbreviatedOid != null) "abbreviatedOid: " + GraphQLRequestSerializer.getEntry(abbreviatedOid) else "", "additions: " + GraphQLRequestSerializer.getEntry(additions), if (associatedPullRequests != null) "associatedPullRequests: " + GraphQLRequestSerializer.getEntry(associatedPullRequests) else "", diff --git a/src/test/resources/expected-classes/scala/Commit_noValidationAnnotation.scala.txt b/src/test/resources/expected-classes/scala/Commit_noValidationAnnotation.scala.txt index f92e664e2..8560400c0 100644 --- a/src/test/resources/expected-classes/scala/Commit_noValidationAnnotation.scala.txt +++ b/src/test/resources/expected-classes/scala/Commit_noValidationAnnotation.scala.txt @@ -50,7 +50,7 @@ case class Commit( ) extends Closer with IssueTimelineItem with PullRequestTimelineItem with Subscribable with Node with GitObject with UniformResourceLocatable { override def toString(): String = { - Seq( + scala.Seq( if (abbreviatedOid != null) "abbreviatedOid: " + GraphQLRequestSerializer.getEntry(abbreviatedOid) else "", "additions: " + GraphQLRequestSerializer.getEntry(additions), if (associatedPullRequests != null) "associatedPullRequests: " + GraphQLRequestSerializer.getEntry(associatedPullRequests) else "", diff --git a/src/test/resources/expected-classes/scala/Commit_no_final_class.scala.txt b/src/test/resources/expected-classes/scala/Commit_no_final_class.scala.txt index a7c6a506f..8402bad3b 100644 --- a/src/test/resources/expected-classes/scala/Commit_no_final_class.scala.txt +++ b/src/test/resources/expected-classes/scala/Commit_no_final_class.scala.txt @@ -75,7 +75,7 @@ class Commit( ) extends Closer with IssueTimelineItem with PullRequestTimelineItem with Subscribable with Node with GitObject with UniformResourceLocatable { override def toString(): String = { - Seq( + scala.Seq( if (abbreviatedOid != null) "abbreviatedOid: " + GraphQLRequestSerializer.getEntry(abbreviatedOid) else "", "additions: " + GraphQLRequestSerializer.getEntry(additions), if (associatedPullRequests != null) "associatedPullRequests: " + GraphQLRequestSerializer.getEntry(associatedPullRequests) else "", diff --git a/src/test/resources/expected-classes/scala/Commit_withPrimitives.scala.txt b/src/test/resources/expected-classes/scala/Commit_withPrimitives.scala.txt index 3cffca61a..f8070c4ab 100644 --- a/src/test/resources/expected-classes/scala/Commit_withPrimitives.scala.txt +++ b/src/test/resources/expected-classes/scala/Commit_withPrimitives.scala.txt @@ -74,7 +74,7 @@ case class Commit( ) extends Closer with IssueTimelineItem with PullRequestTimelineItem with Subscribable with Node with GitObject with UniformResourceLocatable { override def toString(): String = { - Seq( + scala.Seq( if (abbreviatedOid != null) "abbreviatedOid: " + GraphQLRequestSerializer.getEntry(abbreviatedOid) else "", "additions: " + GraphQLRequestSerializer.getEntry(additions), if (associatedPullRequests != null) "associatedPullRequests: " + GraphQLRequestSerializer.getEntry(associatedPullRequests) else "", diff --git a/src/test/resources/expected-classes/scala/Commit_withoutPrimitives.scala.txt b/src/test/resources/expected-classes/scala/Commit_withoutPrimitives.scala.txt index 316299d99..ac52c87a0 100644 --- a/src/test/resources/expected-classes/scala/Commit_withoutPrimitives.scala.txt +++ b/src/test/resources/expected-classes/scala/Commit_withoutPrimitives.scala.txt @@ -80,7 +80,7 @@ case class Commit( ) extends Closer with IssueTimelineItem with PullRequestTimelineItem with Subscribable with Node with GitObject with UniformResourceLocatable { override def toString(): String = { - Seq( + scala.Seq( if (abbreviatedOid != null) "abbreviatedOid: " + GraphQLRequestSerializer.getEntry(abbreviatedOid) else "", if (additions != null) "additions: " + GraphQLRequestSerializer.getEntry(additions) else "", if (associatedPullRequests != null) "associatedPullRequests: " + GraphQLRequestSerializer.getEntry(associatedPullRequests) else "", diff --git a/src/test/resources/expected-classes/scala/GithubAcceptTopicSuggestionInputTO.scala.txt b/src/test/resources/expected-classes/scala/GithubAcceptTopicSuggestionInputTO.scala.txt index cf2335241..84ae4e8a6 100644 --- a/src/test/resources/expected-classes/scala/GithubAcceptTopicSuggestionInputTO.scala.txt +++ b/src/test/resources/expected-classes/scala/GithubAcceptTopicSuggestionInputTO.scala.txt @@ -16,7 +16,7 @@ case class GithubAcceptTopicSuggestionInputTO( ) { override def toString(): String = { - Seq( + scala.Seq( if (clientMutationId != null) "clientMutationId: " + GraphQLRequestSerializer.getEntry(clientMutationId) else "", if (name != null) "name: " + GraphQLRequestSerializer.getEntry(name) else "", if (repositoryId != null) "repositoryId: " + GraphQLRequestSerializer.getEntry(repositoryId) else "" diff --git a/src/test/resources/expected-classes/scala/GithubCommitTO.scala.txt b/src/test/resources/expected-classes/scala/GithubCommitTO.scala.txt index fe94d957e..022c18cf5 100644 --- a/src/test/resources/expected-classes/scala/GithubCommitTO.scala.txt +++ b/src/test/resources/expected-classes/scala/GithubCommitTO.scala.txt @@ -74,7 +74,7 @@ case class GithubCommitTO( ) extends GithubCloserTO with GithubIssueTimelineItemTO with GithubPullRequestTimelineItemTO with GithubGitObjectTO with GithubNodeTO with GithubSubscribableTO with GithubUniformResourceLocatableTO { override def toString(): String = { - Seq( + scala.Seq( if (abbreviatedOid != null) "abbreviatedOid: " + GraphQLRequestSerializer.getEntry(abbreviatedOid) else "", "additions: " + GraphQLRequestSerializer.getEntry(additions), if (associatedPullRequests != null) "associatedPullRequests: " + GraphQLRequestSerializer.getEntry(associatedPullRequests) else "", diff --git a/src/test/resources/expected-classes/scala/QueryINeedQueryRequest.scala.txt b/src/test/resources/expected-classes/scala/QueryINeedQueryRequest.scala.txt index 9ae88121a..5c21fe3b8 100644 --- a/src/test/resources/expected-classes/scala/QueryINeedQueryRequest.scala.txt +++ b/src/test/resources/expected-classes/scala/QueryINeedQueryRequest.scala.txt @@ -3,7 +3,7 @@ package com.kobylynskyi.graphql.test1 import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLOperation import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLOperationRequest import java.util.{ LinkedHashMap => JLinkedHashMap } -import java.util.{ Map => JMap } +import java.util.{ Map => JMap, Set => JSet } import scala.collection.mutable import scala.collection.JavaConverters._ import java.util.Objects @@ -30,7 +30,7 @@ class QueryINeedQueryRequest(alias: String) extends GraphQLOperationRequest { override def getInput(): JMap[String, java.lang.Object] = input - override def getUseObjectMapperForInputSerialization(): java.util.Set[String] = useObjectMapperForInputSerialization.asJava + override def getUseObjectMapperForInputSerialization(): JSet[String] = useObjectMapperForInputSerialization.asJava override def toString(): String = Objects.toString(input) } diff --git a/src/test/resources/expected-classes/scala/QueryINeedQueryRequest_custom_serializer.scala.txt b/src/test/resources/expected-classes/scala/QueryINeedQueryRequest_custom_serializer.scala.txt index 455c04f98..164c69480 100644 --- a/src/test/resources/expected-classes/scala/QueryINeedQueryRequest_custom_serializer.scala.txt +++ b/src/test/resources/expected-classes/scala/QueryINeedQueryRequest_custom_serializer.scala.txt @@ -3,7 +3,7 @@ package com.kobylynskyi.graphql.test1 import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLOperation import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLOperationRequest import java.util.{ LinkedHashMap => JLinkedHashMap } -import java.util.{ Map => JMap } +import java.util.{ Map => JMap, Set => JSet } import java.util.Objects import scala.collection.mutable import scala.collection.JavaConverters._ @@ -30,7 +30,7 @@ class QueryINeedQueryRequest(alias: String) extends GraphQLOperationRequest { override def getInput(): JMap[String, java.lang.Object] = input - override def getUseObjectMapperForInputSerialization(): java.util.Set[String] = useObjectMapperForInputSerialization.asJava + override def getUseObjectMapperForInputSerialization(): JSet[String] = useObjectMapperForInputSerialization.asJava override def toString(): String = Objects.toString(input) } diff --git a/src/test/resources/expected-classes/scala/annotation/CreateEventMutationResolver.scala.txt b/src/test/resources/expected-classes/scala/annotation/CreateEventMutationResolver.scala.txt index f7aef5025..99de67dec 100644 --- a/src/test/resources/expected-classes/scala/annotation/CreateEventMutationResolver.scala.txt +++ b/src/test/resources/expected-classes/scala/annotation/CreateEventMutationResolver.scala.txt @@ -14,7 +14,7 @@ trait CreateEventMutationResolver { * Create a new event. */ @javax.validation.constraints.NotNull - @com.example.CustomAnnotation(roles=Array("admin", "moderator"), boo=Array(true, false, true), float=Array("12.0", "null"), int=42, n="null") + @com.example.CustomAnnotation(roles=scala.Array("admin", "moderator"), boo=scala.Array(true, false, true), float=scala.Array("12.0", "null"), int=42, n="null") @throws[Exception] def createEvent(categoryId: String, createdBy: String): Event diff --git a/src/test/resources/expected-classes/scala/annotation/MutationResolver.scala.txt b/src/test/resources/expected-classes/scala/annotation/MutationResolver.scala.txt index 8aa7c78b2..4bfa853b3 100644 --- a/src/test/resources/expected-classes/scala/annotation/MutationResolver.scala.txt +++ b/src/test/resources/expected-classes/scala/annotation/MutationResolver.scala.txt @@ -11,7 +11,7 @@ trait MutationResolver { * Create a new event. */ @javax.validation.constraints.NotNull - @com.example.CustomAnnotation(roles=Array("admin", "moderator"), boo=Array(true, false, true), float=Array("12.0", "null"), int=42, n="null") + @com.example.CustomAnnotation(roles=scala.Array("admin", "moderator"), boo=scala.Array(true, false, true), float=scala.Array("12.0", "null"), int=42, n="null") @throws[Exception] def createEvent(categoryId: String, createdBy: String): Event diff --git a/src/test/resources/expected-classes/scala/builder/CaseQueryRequest.scala.txt b/src/test/resources/expected-classes/scala/builder/CaseQueryRequest.scala.txt index 8df770287..f5d9c1768 100644 --- a/src/test/resources/expected-classes/scala/builder/CaseQueryRequest.scala.txt +++ b/src/test/resources/expected-classes/scala/builder/CaseQueryRequest.scala.txt @@ -3,7 +3,7 @@ package com.kobylynskyi.graphql.codegen.prot import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLOperation import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLOperationRequest import java.util.{ LinkedHashMap => JLinkedHashMap } -import java.util.{ Map => JMap } +import java.util.{ Map => JMap, Set => JSet } import java.util.Objects import scala.collection.mutable import scala.collection.JavaConverters._ @@ -17,7 +17,7 @@ class CaseQueryRequest(alias: String) extends GraphQLOperationRequest { private final lazy val input = new JLinkedHashMap[String, java.lang.Object]() private final lazy val useObjectMapperForInputSerialization: mutable.Set[String] = mutable.Set() - def setFinal(`final`: Seq[Char]): Unit = { + def setFinal(`final`: scala.Seq[Char]): Unit = { this.input.put("final", `final`) } @@ -29,7 +29,7 @@ class CaseQueryRequest(alias: String) extends GraphQLOperationRequest { override def getInput(): JMap[String, java.lang.Object] = input - override def getUseObjectMapperForInputSerialization(): java.util.Set[String] = useObjectMapperForInputSerialization.asJava + override def getUseObjectMapperForInputSerialization(): JSet[String] = useObjectMapperForInputSerialization.asJava override def equals(obj: Any): Boolean = { if (this == obj) { diff --git a/src/test/resources/expected-classes/scala/custom-type/QueryINeedQueryRequest.scala.txt b/src/test/resources/expected-classes/scala/custom-type/QueryINeedQueryRequest.scala.txt index e165467e9..b8d16e438 100644 --- a/src/test/resources/expected-classes/scala/custom-type/QueryINeedQueryRequest.scala.txt +++ b/src/test/resources/expected-classes/scala/custom-type/QueryINeedQueryRequest.scala.txt @@ -3,7 +3,7 @@ package com.kobylynskyi.graphql.test1 import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLOperation import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLOperationRequest import java.util.{ LinkedHashMap => JLinkedHashMap } -import java.util.{ Map => JMap } +import java.util.{ Map => JMap, Set => JSet } import java.util.Objects import scala.collection.mutable import scala.collection.JavaConverters._ @@ -29,7 +29,7 @@ class QueryINeedQueryRequest(alias: String) extends GraphQLOperationRequest { override def getInput(): JMap[String, java.lang.Object] = input - override def getUseObjectMapperForInputSerialization(): java.util.Set[String] = useObjectMapperForInputSerialization.asJava + override def getUseObjectMapperForInputSerialization(): JSet[String] = useObjectMapperForInputSerialization.asJava override def toString(): String = Objects.toString(input) } diff --git a/src/test/resources/expected-classes/scala/custom-type/QueryINeedQueryRequest_whole_scalar.scala.txt b/src/test/resources/expected-classes/scala/custom-type/QueryINeedQueryRequest_whole_scalar.scala.txt index e165467e9..b8d16e438 100644 --- a/src/test/resources/expected-classes/scala/custom-type/QueryINeedQueryRequest_whole_scalar.scala.txt +++ b/src/test/resources/expected-classes/scala/custom-type/QueryINeedQueryRequest_whole_scalar.scala.txt @@ -3,7 +3,7 @@ package com.kobylynskyi.graphql.test1 import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLOperation import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLOperationRequest import java.util.{ LinkedHashMap => JLinkedHashMap } -import java.util.{ Map => JMap } +import java.util.{ Map => JMap, Set => JSet } import java.util.Objects import scala.collection.mutable import scala.collection.JavaConverters._ @@ -29,7 +29,7 @@ class QueryINeedQueryRequest(alias: String) extends GraphQLOperationRequest { override def getInput(): JMap[String, java.lang.Object] = input - override def getUseObjectMapperForInputSerialization(): java.util.Set[String] = useObjectMapperForInputSerialization.asJava + override def getUseObjectMapperForInputSerialization(): JSet[String] = useObjectMapperForInputSerialization.asJava override def toString(): String = Objects.toString(input) } diff --git a/src/test/resources/expected-classes/scala/custom-type/ResponseContainingDate.scala.txt b/src/test/resources/expected-classes/scala/custom-type/ResponseContainingDate.scala.txt index e20bb9e49..6a447a300 100644 --- a/src/test/resources/expected-classes/scala/custom-type/ResponseContainingDate.scala.txt +++ b/src/test/resources/expected-classes/scala/custom-type/ResponseContainingDate.scala.txt @@ -12,7 +12,7 @@ case class ResponseContainingDate( ) { override def toString(): String = { - Seq( + scala.Seq( if (a != null) "a: " + GraphQLRequestSerializer.getEntry(a) else "" ).filter(_ != "").mkString("{", ",", "}") } diff --git a/src/test/resources/expected-classes/scala/deprecated/EventsQueryResolver.scala.txt b/src/test/resources/expected-classes/scala/deprecated/EventsQueryResolver.scala.txt index f72ba401c..1522cc395 100644 --- a/src/test/resources/expected-classes/scala/deprecated/EventsQueryResolver.scala.txt +++ b/src/test/resources/expected-classes/scala/deprecated/EventsQueryResolver.scala.txt @@ -10,6 +10,6 @@ trait EventsQueryResolver { @deprecated(message = "No longer supported") @javax.validation.constraints.NotNull @throws[Exception] - def events(): Seq[Event] + def events(): scala.Seq[Event] } \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/deprecated/QueryResolver.scala.txt b/src/test/resources/expected-classes/scala/deprecated/QueryResolver.scala.txt index cba7fce5e..a0aeb62c9 100644 --- a/src/test/resources/expected-classes/scala/deprecated/QueryResolver.scala.txt +++ b/src/test/resources/expected-classes/scala/deprecated/QueryResolver.scala.txt @@ -10,6 +10,6 @@ trait QueryResolver { @deprecated(message = "No longer supported") @javax.validation.constraints.NotNull @throws[Exception] - def events(): Seq[Event] + def events(): scala.Seq[Event] } \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/extend/AssetsQueryResolver.scala.txt b/src/test/resources/expected-classes/scala/extend/AssetsQueryResolver.scala.txt index 430469222..b424030e9 100644 --- a/src/test/resources/expected-classes/scala/extend/AssetsQueryResolver.scala.txt +++ b/src/test/resources/expected-classes/scala/extend/AssetsQueryResolver.scala.txt @@ -7,6 +7,6 @@ trait AssetsQueryResolver { @javax.validation.constraints.NotNull @throws[Exception] - def assets(): Seq[Asset] + def assets(): scala.Seq[Asset] } \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/extend/Event.scala.txt b/src/test/resources/expected-classes/scala/extend/Event.scala.txt index bfa03f416..a0e0f0fe4 100644 --- a/src/test/resources/expected-classes/scala/extend/Event.scala.txt +++ b/src/test/resources/expected-classes/scala/extend/Event.scala.txt @@ -11,7 +11,7 @@ case class Event( @javax.validation.constraints.NotNull createdDateTime: String, @javax.validation.constraints.NotNull - assets: Seq[Asset], + assets: scala.Seq[Asset], @javax.validation.constraints.NotNull override val id: String, override val createdBy: String diff --git a/src/test/resources/expected-classes/scala/extend/EventInput.scala.txt b/src/test/resources/expected-classes/scala/extend/EventInput.scala.txt index 20cf37ac6..ec6d2ba5d 100644 --- a/src/test/resources/expected-classes/scala/extend/EventInput.scala.txt +++ b/src/test/resources/expected-classes/scala/extend/EventInput.scala.txt @@ -9,7 +9,7 @@ case class EventInput( @javax.validation.constraints.NotNull status: Status, @javax.validation.constraints.NotNull - assets: Seq[AssetInput] + assets: scala.Seq[AssetInput] ) { } \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/extend/EventsQueryResolver.scala.txt b/src/test/resources/expected-classes/scala/extend/EventsQueryResolver.scala.txt index f791302a9..adf69d90b 100644 --- a/src/test/resources/expected-classes/scala/extend/EventsQueryResolver.scala.txt +++ b/src/test/resources/expected-classes/scala/extend/EventsQueryResolver.scala.txt @@ -7,6 +7,6 @@ trait EventsQueryResolver { @javax.validation.constraints.NotNull @throws[Exception] - def events(): Seq[Event] + def events(): scala.Seq[Event] } \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/extend/QueryResolver.scala.txt b/src/test/resources/expected-classes/scala/extend/QueryResolver.scala.txt index 0b6ca5ce7..35a94c4ff 100644 --- a/src/test/resources/expected-classes/scala/extend/QueryResolver.scala.txt +++ b/src/test/resources/expected-classes/scala/extend/QueryResolver.scala.txt @@ -11,10 +11,10 @@ trait QueryResolver { @javax.validation.constraints.NotNull @throws[Exception] - def events(): Seq[Event] + def events(): scala.Seq[Event] @javax.validation.constraints.NotNull @throws[Exception] - def assets(): Seq[Asset] + def assets(): scala.Seq[Asset] } \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/extend/nullable/Event.scala.txt b/src/test/resources/expected-classes/scala/extend/nullable/Event.scala.txt index 323064889..fc406a8e9 100644 --- a/src/test/resources/expected-classes/scala/extend/nullable/Event.scala.txt +++ b/src/test/resources/expected-classes/scala/extend/nullable/Event.scala.txt @@ -6,13 +6,13 @@ import scala.collection.JavaConverters._ date = "2020-12-31T23:59:59-0500" ) case class Event( - nullableStatus: Seq[Option[Int]], - nonullStatus: Seq[Int], - nullablePrimitive: Option[Int] + nullableStatus: scala.Seq[scala.Option[Int]], + nonullStatus: scala.Seq[Int], + nullablePrimitive: scala.Option[Int] ) extends Node { override def toString(): String = { - Seq( + scala.Seq( if (nullableStatus != null) "nullableStatus: " + GraphQLRequestSerializer.getEntry(nullableStatus.asJava) else "", if (nonullStatus != null) "nonullStatus: " + GraphQLRequestSerializer.getEntry(nonullStatus.asJava) else "", if (nullablePrimitive.isDefined) "nullablePrimitive: " + GraphQLRequestSerializer.getEntry(nullablePrimitive.get) else "" diff --git a/src/test/resources/expected-classes/scala/extend/nullable/Null1QueryQueryResolver.scala.txt b/src/test/resources/expected-classes/scala/extend/nullable/Null1QueryQueryResolver.scala.txt index 4d4b446df..0ed3f12c2 100644 --- a/src/test/resources/expected-classes/scala/extend/nullable/Null1QueryQueryResolver.scala.txt +++ b/src/test/resources/expected-classes/scala/extend/nullable/Null1QueryQueryResolver.scala.txt @@ -6,6 +6,6 @@ trait Null1QueryQueryResolver { @throws[Exception] - def null1Query(): Option[Int] + def null1Query(): scala.Option[Int] } \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/extend/nullable/Null2QueryQueryResolver.scala.txt b/src/test/resources/expected-classes/scala/extend/nullable/Null2QueryQueryResolver.scala.txt index b2ead01f9..442e76d45 100644 --- a/src/test/resources/expected-classes/scala/extend/nullable/Null2QueryQueryResolver.scala.txt +++ b/src/test/resources/expected-classes/scala/extend/nullable/Null2QueryQueryResolver.scala.txt @@ -6,6 +6,6 @@ trait Null2QueryQueryResolver { @throws[Exception] - def null2Query(): Seq[Option[Int]] + def null2Query(): scala.Seq[scala.Option[Int]] } \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/extend/nullable/Null3QueryQueryResolver.scala.txt b/src/test/resources/expected-classes/scala/extend/nullable/Null3QueryQueryResolver.scala.txt index eccf1c0ef..22336eddd 100644 --- a/src/test/resources/expected-classes/scala/extend/nullable/Null3QueryQueryResolver.scala.txt +++ b/src/test/resources/expected-classes/scala/extend/nullable/Null3QueryQueryResolver.scala.txt @@ -6,6 +6,6 @@ trait Null3QueryQueryResolver { @throws[Exception] - def null3Query(): Seq[Int] + def null3Query(): scala.Seq[Int] } \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/extend/nullable/QueryResolver.scala.txt b/src/test/resources/expected-classes/scala/extend/nullable/QueryResolver.scala.txt index 0dc9cef7e..df8ac926b 100644 --- a/src/test/resources/expected-classes/scala/extend/nullable/QueryResolver.scala.txt +++ b/src/test/resources/expected-classes/scala/extend/nullable/QueryResolver.scala.txt @@ -7,18 +7,18 @@ trait QueryResolver { @javax.validation.constraints.NotNull @throws[Exception] - def events(): Seq[Event] + def events(): scala.Seq[Event] @throws[Exception] - def event(): Option[Event] + def event(): scala.Option[Event] @throws[Exception] - def null1Query(): Option[Int] + def null1Query(): scala.Option[Int] @throws[Exception] - def null2Query(): Seq[Option[Int]] + def null2Query(): scala.Seq[scala.Option[Int]] @throws[Exception] - def null3Query(): Seq[Int] + def null3Query(): scala.Seq[Int] } \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/extend/nullreturn/SimpleEventCountsQueryResolver.scala.txt b/src/test/resources/expected-classes/scala/extend/nullreturn/SimpleEventCountsQueryResolver.scala.txt index 940401255..c04e8d8ec 100644 --- a/src/test/resources/expected-classes/scala/extend/nullreturn/SimpleEventCountsQueryResolver.scala.txt +++ b/src/test/resources/expected-classes/scala/extend/nullreturn/SimpleEventCountsQueryResolver.scala.txt @@ -6,6 +6,6 @@ trait SimpleEventCountsQueryResolver { @throws[Exception] - def simpleEventCounts(): Option[Int] + def simpleEventCounts(): scala.Option[Int] } \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/extend/nullreturn/SimplesQueryResolver.scala.txt b/src/test/resources/expected-classes/scala/extend/nullreturn/SimplesQueryResolver.scala.txt index 21ec06107..08173a76f 100644 --- a/src/test/resources/expected-classes/scala/extend/nullreturn/SimplesQueryResolver.scala.txt +++ b/src/test/resources/expected-classes/scala/extend/nullreturn/SimplesQueryResolver.scala.txt @@ -5,6 +5,6 @@ trait SimplesQueryResolver { @throws[Exception] - def simples(): Option[Event] + def simples(): scala.Option[Event] } \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/extend/resolver/SimpleEventCountsQueryResolver.scala.txt b/src/test/resources/expected-classes/scala/extend/resolver/SimpleEventCountsQueryResolver.scala.txt index 1cc88b34d..5eaee69dd 100644 --- a/src/test/resources/expected-classes/scala/extend/resolver/SimpleEventCountsQueryResolver.scala.txt +++ b/src/test/resources/expected-classes/scala/extend/resolver/SimpleEventCountsQueryResolver.scala.txt @@ -5,6 +5,6 @@ trait SimpleEventCountsQueryResolver { @throws[Exception] - def simpleEventCounts(): Option[Int] + def simpleEventCounts(): scala.Option[Int] } \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/extend/resolver/SimpleEventCountsQueryResponse.scala.txt b/src/test/resources/expected-classes/scala/extend/resolver/SimpleEventCountsQueryResponse.scala.txt index b9e2c2c95..65aef63f4 100644 --- a/src/test/resources/expected-classes/scala/extend/resolver/SimpleEventCountsQueryResponse.scala.txt +++ b/src/test/resources/expected-classes/scala/extend/resolver/SimpleEventCountsQueryResponse.scala.txt @@ -5,10 +5,10 @@ import java.util.{ Map => JMap } value = Array("com.kobylynskyi.graphql.codegen.GraphQLCodegen"), date = "2020-12-31T23:59:59-0500" ) -class SimpleEventCountsQueryResponse extends GraphQLResult[JMap[String, Option[Int]]] { +class SimpleEventCountsQueryResponse extends GraphQLResult[JMap[String, scala.Option[Int]]] { - def simpleEventCounts(): Option[Int] = { - val data: JMap[String, Option[Int]] = getData + def simpleEventCounts(): scala.Option[Int] = { + val data: JMap[String, scala.Option[Int]] = getData if (data != null) data.get(SimpleEventCountsQueryResponse.OPERATION_NAME) else None } diff --git a/src/test/resources/expected-classes/scala/optional/TypeWithMandatoryField.scala.txt b/src/test/resources/expected-classes/scala/optional/TypeWithMandatoryField.scala.txt index 9bdc7a2b7..63d3908e7 100644 --- a/src/test/resources/expected-classes/scala/optional/TypeWithMandatoryField.scala.txt +++ b/src/test/resources/expected-classes/scala/optional/TypeWithMandatoryField.scala.txt @@ -9,7 +9,7 @@ case class TypeWithMandatoryField( ) extends InterfaceWithOptionalField { override def toString(): String = { - Seq( + scala.Seq( "test: " + test ).filter(_ != "").mkString("{", ",", "}") } diff --git a/src/test/resources/expected-classes/scala/relay/OrganizationsQueryResolver.scala.txt b/src/test/resources/expected-classes/scala/relay/OrganizationsQueryResolver.scala.txt index 597eaadc6..884aaf942 100644 --- a/src/test/resources/expected-classes/scala/relay/OrganizationsQueryResolver.scala.txt +++ b/src/test/resources/expected-classes/scala/relay/OrganizationsQueryResolver.scala.txt @@ -5,6 +5,6 @@ trait OrganizationsQueryResolver { @throws[Exception] - def organizations(first: Option[Int], after: String, env: graphql.schema.DataFetchingEnvironment): graphql.relay.Connection[Organization] + def organizations(first: scala.Option[Int], after: String, env: graphql.schema.DataFetchingEnvironment): graphql.relay.Connection[Organization] } \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/relay/QueryResolver.scala.txt b/src/test/resources/expected-classes/scala/relay/QueryResolver.scala.txt index ffa9a9fb0..eeb337889 100644 --- a/src/test/resources/expected-classes/scala/relay/QueryResolver.scala.txt +++ b/src/test/resources/expected-classes/scala/relay/QueryResolver.scala.txt @@ -8,6 +8,6 @@ trait QueryResolver { def users(first: Int, after: String, env: graphql.schema.DataFetchingEnvironment): graphql.relay.Connection[User] @throws[Exception] - def organizations(first: Option[Int], after: String, env: graphql.schema.DataFetchingEnvironment): graphql.relay.Connection[Organization] + def organizations(first: scala.Option[Int], after: String, env: graphql.schema.DataFetchingEnvironment): graphql.relay.Connection[Organization] } \ No newline at end of file diff --git a/src/test/resources/expected-classes/scala/tostring/QueryPrivateParametrizedInput.scala.txt b/src/test/resources/expected-classes/scala/tostring/QueryPrivateParametrizedInput.scala.txt index a3dd8cb68..53357d438 100644 --- a/src/test/resources/expected-classes/scala/tostring/QueryPrivateParametrizedInput.scala.txt +++ b/src/test/resources/expected-classes/scala/tostring/QueryPrivateParametrizedInput.scala.txt @@ -14,15 +14,15 @@ import TestEnum._ ) case class QueryPrivateParametrizedInput( int: Int, - intOpt: Option[Int], - seq1: Seq[Option[Int]], - seq2: Seq[Int], + intOpt: scala.Option[Int], + seq1: scala.Seq[scala.Option[Int]], + seq2: scala.Seq[Int], `new`: String, enum: TestEnum = TestEnum.long ) extends GraphQLParametrizedInput { override def toString(): String = { - Seq( + scala.Seq( "int: " + GraphQLRequestSerializer.getEntry(int), if (intOpt.isDefined) "intOpt: " + GraphQLRequestSerializer.getEntry(intOpt.get) else "", if (seq1 != null) "seq1: " + GraphQLRequestSerializer.getEntry(seq1.asJava) else "", diff --git a/src/test/resources/expected-classes/scala/tostring/Synchronized.scala.txt b/src/test/resources/expected-classes/scala/tostring/Synchronized.scala.txt index 9b86a5628..176503556 100644 --- a/src/test/resources/expected-classes/scala/tostring/Synchronized.scala.txt +++ b/src/test/resources/expected-classes/scala/tostring/Synchronized.scala.txt @@ -22,7 +22,7 @@ case class Synchronized( ) { override def toString(): String = { - Seq( + scala.Seq( if (void != null) "void: " + GraphQLRequestSerializer.getEntry(void) else "", "wait: " + GraphQLRequestSerializer.getEntry(Wait), "this: " + GraphQLRequestSerializer.getEntry(`this`), diff --git a/src/test/resources/expected-classes/scala/tostring/TOSTRING_Synchronized.scala.txt b/src/test/resources/expected-classes/scala/tostring/TOSTRING_Synchronized.scala.txt index e9f961bcd..6f83af8f8 100644 --- a/src/test/resources/expected-classes/scala/tostring/TOSTRING_Synchronized.scala.txt +++ b/src/test/resources/expected-classes/scala/tostring/TOSTRING_Synchronized.scala.txt @@ -21,7 +21,7 @@ case class Synchronized( ) { override def toString(): String = { - Seq( + scala.Seq( if (void != null) "void: \"void\"" else "", "wait: " + Wait, "this: " + `this`, diff --git a/src/test/resources/schemas/defaults-with-Long.graphqls b/src/test/resources/schemas/defaults-with-Long.graphqls index 514ea79d7..ce1a610c3 100644 --- a/src/test/resources/schemas/defaults-with-Long.graphqls +++ b/src/test/resources/schemas/defaults-with-Long.graphqls @@ -1,4 +1,3 @@ - # This input has all possible types input InputWithDefaults { floatVal: Float = 1.23 diff --git a/src/test/resources/schemas/defaults.graphqls b/src/test/resources/schemas/defaults.graphqls index ef1bc5c00..5347493fc 100644 --- a/src/test/resources/schemas/defaults.graphqls +++ b/src/test/resources/schemas/defaults.graphqls @@ -1,4 +1,3 @@ - # This input has all possible types input InputWithDefaults { floatVal: Float = 1.23 diff --git a/src/test/resources/schemas/github.graphqls b/src/test/resources/schemas/github.graphqls index 10b2417bf..84c12beb4 100644 --- a/src/test/resources/schemas/github.graphqls +++ b/src/test/resources/schemas/github.graphqls @@ -1,1589 +1,1588 @@ - input AcceptTopicSuggestionInput { - clientMutationId: String + clientMutationId: String - name: String! + name: String! - repositoryId: ID! + repositoryId: ID! } type AcceptTopicSuggestionPayload { - clientMutationId: String + clientMutationId: String - topic: Topic + topic: Topic } interface Actor { - avatarUrl( - size: Int - ): URI! + avatarUrl( + size: Int + ): URI! - login: String! + login: String! - resourcePath: URI! + resourcePath: URI! - url: URI! + url: URI! } input AddAssigneesToAssignableInput { - assignableId: ID! + assignableId: ID! - assigneeIds: [ID!]! + assigneeIds: [ID!]! - clientMutationId: String + clientMutationId: String } type AddAssigneesToAssignablePayload { - assignable: Assignable + assignable: Assignable - clientMutationId: String + clientMutationId: String } input AddCommentInput { - body: String! + body: String! - clientMutationId: String + clientMutationId: String - subjectId: ID! + subjectId: ID! } type AddCommentPayload { - clientMutationId: String + clientMutationId: String - commentEdge: IssueCommentEdge + commentEdge: IssueCommentEdge - subject: Node + subject: Node - timelineEdge: IssueTimelineItemEdge + timelineEdge: IssueTimelineItemEdge } input AddLabelsToLabelableInput { - clientMutationId: String + clientMutationId: String - labelIds: [ID!]! + labelIds: [ID!]! - labelableId: ID! + labelableId: ID! } type AddLabelsToLabelablePayload { - clientMutationId: String + clientMutationId: String - labelable: Labelable + labelable: Labelable } input AddProjectCardInput { - clientMutationId: String + clientMutationId: String - contentId: ID + contentId: ID - note: String + note: String - projectColumnId: ID! + projectColumnId: ID! } type AddProjectCardPayload { - cardEdge: ProjectCardEdge + cardEdge: ProjectCardEdge - clientMutationId: String + clientMutationId: String - projectColumn: ProjectColumn + projectColumn: ProjectColumn } input AddProjectColumnInput { - clientMutationId: String + clientMutationId: String - name: String! + name: String! - projectId: ID! + projectId: ID! } type AddProjectColumnPayload { - clientMutationId: String + clientMutationId: String - columnEdge: ProjectColumnEdge + columnEdge: ProjectColumnEdge - project: Project + project: Project } input AddPullRequestReviewCommentInput { - body: String! + body: String! - clientMutationId: String + clientMutationId: String - commitOID: GitObjectID + commitOID: GitObjectID - inReplyTo: ID + inReplyTo: ID - path: String + path: String - position: Int + position: Int - pullRequestReviewId: ID! + pullRequestReviewId: ID! } type AddPullRequestReviewCommentPayload { - clientMutationId: String + clientMutationId: String - comment: PullRequestReviewComment + comment: PullRequestReviewComment - commentEdge: PullRequestReviewCommentEdge + commentEdge: PullRequestReviewCommentEdge } input AddPullRequestReviewInput { - body: String + body: String - clientMutationId: String + clientMutationId: String - comments: [DraftPullRequestReviewComment] + comments: [DraftPullRequestReviewComment] - commitOID: GitObjectID + commitOID: GitObjectID - event: PullRequestReviewEvent + event: PullRequestReviewEvent - pullRequestId: ID! + pullRequestId: ID! } type AddPullRequestReviewPayload { - clientMutationId: String + clientMutationId: String - pullRequestReview: PullRequestReview + pullRequestReview: PullRequestReview - reviewEdge: PullRequestReviewEdge + reviewEdge: PullRequestReviewEdge } input AddReactionInput { - clientMutationId: String + clientMutationId: String - content: ReactionContent! + content: ReactionContent! - subjectId: ID! + subjectId: ID! } type AddReactionPayload { - clientMutationId: String + clientMutationId: String - reaction: Reaction + reaction: Reaction - subject: Reactable + subject: Reactable } input AddStarInput { - clientMutationId: String + clientMutationId: String - starrableId: ID! + starrableId: ID! } type AddStarPayload { - clientMutationId: String + clientMutationId: String - starrable: Starrable + starrable: Starrable } type AddedToProjectEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! + createdAt: DateTime! - databaseId: Int - id: ID! + databaseId: Int + id: ID! } type App implements Node { - createdAt: DateTime! + createdAt: DateTime! - databaseId: Int + databaseId: Int - description: String - id: ID! + description: String + id: ID! - logoBackgroundColor: String! + logoBackgroundColor: String! - logoUrl( - size: Int - ): URI! + logoUrl( + size: Int + ): URI! - name: String! + name: String! - slug: String! + slug: String! - updatedAt: DateTime! + updatedAt: DateTime! - url: URI! + url: URI! } type AppEdge { - cursor: String! + cursor: String! - node: App + node: App } interface Assignable { - assignees( - after: String + assignees( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): UserConnection! + last: Int + ): UserConnection! } type AssignedEvent implements Node { - actor: Actor + actor: Actor - assignable: Assignable! + assignable: Assignable! - assignee: Assignee + assignee: Assignee - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - user: User @deprecated(reason: "Assignees can now be mannequins. Use the `assignee` field instead. Removal on 2020-01-01 UTC.") + user: User @deprecated(reason: "Assignees can now be mannequins. Use the `assignee` field instead. Removal on 2020-01-01 UTC.") } union Assignee = Bot | Mannequin | Organization | User type BaseRefChangedEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! + createdAt: DateTime! - databaseId: Int - id: ID! + databaseId: Int + id: ID! } type BaseRefForcePushedEvent implements Node { - actor: Actor + actor: Actor - afterCommit: Commit + afterCommit: Commit - beforeCommit: Commit + beforeCommit: Commit - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - pullRequest: PullRequest! + pullRequest: PullRequest! - ref: Ref + ref: Ref } type Blame { - ranges: [BlameRange!]! + ranges: [BlameRange!]! } type BlameRange { - age: Int! + age: Int! - commit: Commit! + commit: Commit! - endingLine: Int! + endingLine: Int! - startingLine: Int! + startingLine: Int! } type Blob implements GitObject & Node { - abbreviatedOid: String! + abbreviatedOid: String! - byteSize: Int! + byteSize: Int! - commitResourcePath: URI! + commitResourcePath: URI! - commitUrl: URI! - id: ID! + commitUrl: URI! + id: ID! - isBinary: Boolean! + isBinary: Boolean! - isTruncated: Boolean! + isTruncated: Boolean! - oid: GitObjectID! + oid: GitObjectID! - repository: Repository! + repository: Repository! - text: String + text: String } type Bot implements Actor & Node & UniformResourceLocatable { - avatarUrl( - size: Int - ): URI! + avatarUrl( + size: Int + ): URI! - createdAt: DateTime! + createdAt: DateTime! - databaseId: Int - id: ID! + databaseId: Int + id: ID! - login: String! + login: String! - resourcePath: URI! + resourcePath: URI! - updatedAt: DateTime! + updatedAt: DateTime! - url: URI! + url: URI! } type BranchProtectionRule implements Node { - branchProtectionRuleConflicts( - after: String + branchProtectionRuleConflicts( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): BranchProtectionRuleConflictConnection! + last: Int + ): BranchProtectionRuleConflictConnection! - creator: Actor + creator: Actor - databaseId: Int + databaseId: Int - dismissesStaleReviews: Boolean! - id: ID! + dismissesStaleReviews: Boolean! + id: ID! - isAdminEnforced: Boolean! + isAdminEnforced: Boolean! - matchingRefs( - after: String + matchingRefs( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): RefConnection! + last: Int + ): RefConnection! - pattern: String! + pattern: String! - pushAllowances( - after: String + pushAllowances( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): PushAllowanceConnection! + last: Int + ): PushAllowanceConnection! - repository: Repository + repository: Repository - requiredApprovingReviewCount: Int + requiredApprovingReviewCount: Int - requiredStatusCheckContexts: [String] + requiredStatusCheckContexts: [String] - requiresApprovingReviews: Boolean! + requiresApprovingReviews: Boolean! - requiresCodeOwnerReviews: Boolean! + requiresCodeOwnerReviews: Boolean! - requiresCommitSignatures: Boolean! + requiresCommitSignatures: Boolean! - requiresStatusChecks: Boolean! + requiresStatusChecks: Boolean! - requiresStrictStatusChecks: Boolean! + requiresStrictStatusChecks: Boolean! - restrictsPushes: Boolean! + restrictsPushes: Boolean! - restrictsReviewDismissals: Boolean! + restrictsReviewDismissals: Boolean! - reviewDismissalAllowances( - after: String + reviewDismissalAllowances( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): ReviewDismissalAllowanceConnection! + last: Int + ): ReviewDismissalAllowanceConnection! } type BranchProtectionRuleConflict { - branchProtectionRule: BranchProtectionRule + branchProtectionRule: BranchProtectionRule - conflictingBranchProtectionRule: BranchProtectionRule + conflictingBranchProtectionRule: BranchProtectionRule - ref: Ref + ref: Ref } type BranchProtectionRuleConflictConnection { - edges: [BranchProtectionRuleConflictEdge] + edges: [BranchProtectionRuleConflictEdge] - nodes: [BranchProtectionRuleConflict] + nodes: [BranchProtectionRuleConflict] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type BranchProtectionRuleConflictEdge { - cursor: String! + cursor: String! - node: BranchProtectionRuleConflict + node: BranchProtectionRuleConflict } type BranchProtectionRuleConnection { - edges: [BranchProtectionRuleEdge] + edges: [BranchProtectionRuleEdge] - nodes: [BranchProtectionRule] + nodes: [BranchProtectionRule] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type BranchProtectionRuleEdge { - cursor: String! + cursor: String! - node: BranchProtectionRule + node: BranchProtectionRule } input ChangeUserStatusInput { - clientMutationId: String + clientMutationId: String - emoji: String + emoji: String - expiresAt: DateTime + expiresAt: DateTime - limitedAvailability: Boolean = false + limitedAvailability: Boolean = false - message: String + message: String - organizationId: ID + organizationId: ID } type ChangeUserStatusPayload { - clientMutationId: String + clientMutationId: String - status: UserStatus + status: UserStatus } input ClearLabelsFromLabelableInput { - clientMutationId: String + clientMutationId: String - labelableId: ID! + labelableId: ID! } type ClearLabelsFromLabelablePayload { - clientMutationId: String + clientMutationId: String - labelable: Labelable + labelable: Labelable } input CloneProjectInput { - body: String + body: String - clientMutationId: String + clientMutationId: String - includeWorkflows: Boolean! + includeWorkflows: Boolean! - name: String! + name: String! - public: Boolean + public: Boolean - sourceId: ID! + sourceId: ID! - targetOwnerId: ID! + targetOwnerId: ID! } type CloneProjectPayload { - clientMutationId: String + clientMutationId: String - jobStatusId: String + jobStatusId: String - project: Project + project: Project } input CloneTemplateRepositoryInput { - clientMutationId: String + clientMutationId: String - description: String + description: String - name: String! + name: String! - ownerId: ID! + ownerId: ID! - repositoryId: ID! + repositoryId: ID! - visibility: RepositoryVisibility! + visibility: RepositoryVisibility! } type CloneTemplateRepositoryPayload { - clientMutationId: String + clientMutationId: String - repository: Repository + repository: Repository } interface Closable { - closed: Boolean! + closed: Boolean! - closedAt: DateTime + closedAt: DateTime } input CloseIssueInput { - clientMutationId: String + clientMutationId: String - issueId: ID! + issueId: ID! } type CloseIssuePayload { - clientMutationId: String + clientMutationId: String - issue: Issue + issue: Issue } input ClosePullRequestInput { - clientMutationId: String + clientMutationId: String - pullRequestId: ID! + pullRequestId: ID! } type ClosePullRequestPayload { - clientMutationId: String + clientMutationId: String - pullRequest: PullRequest + pullRequest: PullRequest } type ClosedEvent implements Node & UniformResourceLocatable { - actor: Actor + actor: Actor - closable: Closable! + closable: Closable! - closer: Closer + closer: Closer - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - resourcePath: URI! + resourcePath: URI! - url: URI! + url: URI! } union Closer = Commit | PullRequest type CodeOfConduct implements Node { - body: String - id: ID! + body: String + id: ID! - key: String! + key: String! - name: String! + name: String! - resourcePath: URI + resourcePath: URI - url: URI + url: URI } enum CollaboratorAffiliation { - ALL + ALL - DIRECT + DIRECT - OUTSIDE + OUTSIDE } union CollectionItemContent = Organization | Repository | User interface Comment { - author: Actor + author: Actor - authorAssociation: CommentAuthorAssociation! + authorAssociation: CommentAuthorAssociation! - body: String! + body: String! - bodyHTML: HTML! + bodyHTML: HTML! - bodyText: String! + bodyText: String! - createdAt: DateTime! + createdAt: DateTime! - createdViaEmail: Boolean! + createdViaEmail: Boolean! - editor: Actor - id: ID! + editor: Actor + id: ID! - includesCreatedEdit: Boolean! + includesCreatedEdit: Boolean! - lastEditedAt: DateTime + lastEditedAt: DateTime - publishedAt: DateTime + publishedAt: DateTime - updatedAt: DateTime! + updatedAt: DateTime! - userContentEdits( - after: String + userContentEdits( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): UserContentEditConnection + last: Int + ): UserContentEditConnection - viewerDidAuthor: Boolean! + viewerDidAuthor: Boolean! } enum CommentAuthorAssociation { - COLLABORATOR + COLLABORATOR - CONTRIBUTOR + CONTRIBUTOR - FIRST_TIMER + FIRST_TIMER - FIRST_TIME_CONTRIBUTOR + FIRST_TIME_CONTRIBUTOR - MEMBER + MEMBER - NONE + NONE - OWNER + OWNER } enum CommentCannotUpdateReason { - DENIED + DENIED - INSUFFICIENT_ACCESS + INSUFFICIENT_ACCESS - LOCKED + LOCKED - LOGIN_REQUIRED + LOGIN_REQUIRED - MAINTENANCE + MAINTENANCE - VERIFIED_EMAIL_REQUIRED + VERIFIED_EMAIL_REQUIRED } type CommentDeletedEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! + createdAt: DateTime! - databaseId: Int - id: ID! + databaseId: Int + id: ID! } type Commit implements GitObject & Node & Subscribable & UniformResourceLocatable { - abbreviatedOid: String! + abbreviatedOid: String! - additions: Int! + additions: Int! - associatedPullRequests( - after: String + associatedPullRequests( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: PullRequestOrder = {field: CREATED_AT, direction: ASC} - ): PullRequestConnection + orderBy: PullRequestOrder = {field: CREATED_AT, direction: ASC} + ): PullRequestConnection - author: GitActor + author: GitActor - authoredByCommitter: Boolean! + authoredByCommitter: Boolean! - authoredDate: DateTime! + authoredDate: DateTime! - blame( - path: String! - ): Blame! + blame( + path: String! + ): Blame! - changedFiles: Int! + changedFiles: Int! - comments( - after: String + comments( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): CommitCommentConnection! + last: Int + ): CommitCommentConnection! - commitResourcePath: URI! + commitResourcePath: URI! - commitUrl: URI! + commitUrl: URI! - committedDate: DateTime! + committedDate: DateTime! - committedViaWeb: Boolean! + committedViaWeb: Boolean! - committer: GitActor + committer: GitActor - deletions: Int! + deletions: Int! - deployments( - after: String + deployments( + after: String - before: String + before: String - environments: [String!] + environments: [String!] - first: Int + first: Int - last: Int + last: Int - orderBy: DeploymentOrder = {field: CREATED_AT, direction: ASC} - ): DeploymentConnection + orderBy: DeploymentOrder = {field: CREATED_AT, direction: ASC} + ): DeploymentConnection - history( - after: String + history( + after: String - author: CommitAuthor + author: CommitAuthor - before: String + before: String - first: Int + first: Int - last: Int + last: Int - path: String + path: String - since: GitTimestamp + since: GitTimestamp - until: GitTimestamp - ): CommitHistoryConnection! - id: ID! + until: GitTimestamp + ): CommitHistoryConnection! + id: ID! - message: String! + message: String! - messageBody: String! + messageBody: String! - messageBodyHTML: HTML! + messageBodyHTML: HTML! - messageHeadline: String! + messageHeadline: String! - messageHeadlineHTML: HTML! + messageHeadlineHTML: HTML! - oid: GitObjectID! + oid: GitObjectID! - parents( - after: String + parents( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): CommitConnection! + last: Int + ): CommitConnection! - pushedDate: DateTime + pushedDate: DateTime - repository: Repository! + repository: Repository! - resourcePath: URI! + resourcePath: URI! - signature: GitSignature + signature: GitSignature - status: Status + status: Status - tarballUrl: URI! + tarballUrl: URI! - tree: Tree! + tree: Tree! - treeResourcePath: URI! + treeResourcePath: URI! - treeUrl: URI! + treeUrl: URI! - url: URI! + url: URI! - viewerCanSubscribe: Boolean! + viewerCanSubscribe: Boolean! - viewerSubscription: SubscriptionState + viewerSubscription: SubscriptionState - zipballUrl: URI! + zipballUrl: URI! } input CommitAuthor { - emails: [String!] + emails: [String!] - id: ID + id: ID } type CommitComment implements Comment & Deletable & Node & Reactable & RepositoryNode & Updatable & UpdatableComment { - author: Actor + author: Actor - authorAssociation: CommentAuthorAssociation! + authorAssociation: CommentAuthorAssociation! - body: String! + body: String! - bodyHTML: HTML! + bodyHTML: HTML! - bodyText: String! + bodyText: String! - commit: Commit + commit: Commit - createdAt: DateTime! + createdAt: DateTime! - createdViaEmail: Boolean! + createdViaEmail: Boolean! - databaseId: Int + databaseId: Int - editor: Actor - id: ID! + editor: Actor + id: ID! - includesCreatedEdit: Boolean! + includesCreatedEdit: Boolean! - isMinimized: Boolean! + isMinimized: Boolean! - lastEditedAt: DateTime + lastEditedAt: DateTime - minimizedReason: String + minimizedReason: String - path: String + path: String - position: Int + position: Int - publishedAt: DateTime + publishedAt: DateTime - reactionGroups: [ReactionGroup!] + reactionGroups: [ReactionGroup!] - reactions( - after: String + reactions( + after: String - before: String + before: String - content: ReactionContent + content: ReactionContent - first: Int + first: Int - last: Int + last: Int - orderBy: ReactionOrder - ): ReactionConnection! + orderBy: ReactionOrder + ): ReactionConnection! - repository: Repository! + repository: Repository! - resourcePath: URI! + resourcePath: URI! - updatedAt: DateTime! + updatedAt: DateTime! - url: URI! + url: URI! - userContentEdits( - after: String + userContentEdits( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): UserContentEditConnection + last: Int + ): UserContentEditConnection - viewerCanDelete: Boolean! + viewerCanDelete: Boolean! - viewerCanMinimize: Boolean! + viewerCanMinimize: Boolean! - viewerCanReact: Boolean! + viewerCanReact: Boolean! - viewerCanUpdate: Boolean! + viewerCanUpdate: Boolean! - viewerCannotUpdateReasons: [CommentCannotUpdateReason!]! + viewerCannotUpdateReasons: [CommentCannotUpdateReason!]! - viewerDidAuthor: Boolean! + viewerDidAuthor: Boolean! } type CommitCommentConnection { - edges: [CommitCommentEdge] + edges: [CommitCommentEdge] - nodes: [CommitComment] + nodes: [CommitComment] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type CommitCommentEdge { - cursor: String! + cursor: String! - node: CommitComment + node: CommitComment } type CommitCommentThread implements Node & RepositoryNode { - comments( - after: String + comments( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): CommitCommentConnection! + last: Int + ): CommitCommentConnection! - commit: Commit! - id: ID! + commit: Commit! + id: ID! - path: String + path: String - position: Int + position: Int - repository: Repository! + repository: Repository! } type CommitConnection { - edges: [CommitEdge] + edges: [CommitEdge] - nodes: [Commit] + nodes: [Commit] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } input CommitContributionOrder { - direction: OrderDirection! + direction: OrderDirection! - field: CommitContributionOrderField! + field: CommitContributionOrderField! } enum CommitContributionOrderField { - COMMIT_COUNT + COMMIT_COUNT - OCCURRED_AT + OCCURRED_AT } type CommitContributionsByRepository { - contributions( - after: String + contributions( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: CommitContributionOrder = {field: OCCURRED_AT, direction: DESC} - ): CreatedCommitContributionConnection! + orderBy: CommitContributionOrder = {field: OCCURRED_AT, direction: DESC} + ): CreatedCommitContributionConnection! - repository: Repository! + repository: Repository! - resourcePath: URI! + resourcePath: URI! - url: URI! + url: URI! } type CommitEdge { - cursor: String! + cursor: String! - node: Commit + node: Commit } type CommitHistoryConnection { - edges: [CommitEdge] + edges: [CommitEdge] - nodes: [Commit] + nodes: [Commit] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type ContentAttachment { - body: String! + body: String! - contentReference: ContentReference! + contentReference: ContentReference! - databaseId: Int! - id: ID! + databaseId: Int! + id: ID! - title: String! + title: String! } type ContentReference { - databaseId: Int! - id: ID! + databaseId: Int! + id: ID! - reference: String! + reference: String! } interface Contribution { - isRestricted: Boolean! + isRestricted: Boolean! - occurredAt: DateTime! + occurredAt: DateTime! - resourcePath: URI! + resourcePath: URI! - url: URI! + url: URI! - user: User! + user: User! } type ContributionCalendar { - colors: [String!]! + colors: [String!]! - isHalloween: Boolean! + isHalloween: Boolean! - months: [ContributionCalendarMonth!]! + months: [ContributionCalendarMonth!]! - totalContributions: Int! + totalContributions: Int! - weeks: [ContributionCalendarWeek!]! + weeks: [ContributionCalendarWeek!]! } type ContributionCalendarDay { - color: String! + color: String! - contributionCount: Int! + contributionCount: Int! - date: Date! + date: Date! - weekday: Int! + weekday: Int! } type ContributionCalendarMonth { - firstDay: Date! + firstDay: Date! - name: String! + name: String! - totalWeeks: Int! + totalWeeks: Int! - year: Int! + year: Int! } type ContributionCalendarWeek { - contributionDays: [ContributionCalendarDay!]! + contributionDays: [ContributionCalendarDay!]! - firstDay: Date! + firstDay: Date! } input ContributionOrder { - direction: OrderDirection! + direction: OrderDirection! - field: ContributionOrderField + field: ContributionOrderField } enum ContributionOrderField { - OCCURRED_AT + OCCURRED_AT } type ContributionsCollection { - commitContributionsByRepository( - maxRepositories: Int = 25 - ): [CommitContributionsByRepository!]! + commitContributionsByRepository( + maxRepositories: Int = 25 + ): [CommitContributionsByRepository!]! - contributionCalendar: ContributionCalendar! + contributionCalendar: ContributionCalendar! - contributionYears: [Int!]! + contributionYears: [Int!]! - doesEndInCurrentMonth: Boolean! + doesEndInCurrentMonth: Boolean! - earliestRestrictedContributionDate: Date + earliestRestrictedContributionDate: Date - endedAt: DateTime! + endedAt: DateTime! - firstIssueContribution: CreatedIssueOrRestrictedContribution + firstIssueContribution: CreatedIssueOrRestrictedContribution - firstPullRequestContribution: CreatedPullRequestOrRestrictedContribution + firstPullRequestContribution: CreatedPullRequestOrRestrictedContribution - firstRepositoryContribution: CreatedRepositoryOrRestrictedContribution + firstRepositoryContribution: CreatedRepositoryOrRestrictedContribution - hasActivityInThePast: Boolean! + hasActivityInThePast: Boolean! - hasAnyContributions: Boolean! + hasAnyContributions: Boolean! - hasAnyRestrictedContributions: Boolean! + hasAnyRestrictedContributions: Boolean! - isSingleDay: Boolean! + isSingleDay: Boolean! - issueContributions( - after: String + issueContributions( + after: String - before: String + before: String - excludeFirst: Boolean = false + excludeFirst: Boolean = false - excludePopular: Boolean = false + excludePopular: Boolean = false - first: Int + first: Int - last: Int + last: Int - orderBy: ContributionOrder = {field: OCCURRED_AT, direction: DESC} - ): CreatedIssueContributionConnection! + orderBy: ContributionOrder = {field: OCCURRED_AT, direction: DESC} + ): CreatedIssueContributionConnection! - issueContributionsByRepository( - excludeFirst: Boolean = false + issueContributionsByRepository( + excludeFirst: Boolean = false - excludePopular: Boolean = false + excludePopular: Boolean = false - maxRepositories: Int = 25 - ): [IssueContributionsByRepository!]! + maxRepositories: Int = 25 + ): [IssueContributionsByRepository!]! - joinedGitHubContribution: JoinedGitHubContribution + joinedGitHubContribution: JoinedGitHubContribution - latestRestrictedContributionDate: Date + latestRestrictedContributionDate: Date - mostRecentCollectionWithActivity: ContributionsCollection + mostRecentCollectionWithActivity: ContributionsCollection - mostRecentCollectionWithoutActivity: ContributionsCollection + mostRecentCollectionWithoutActivity: ContributionsCollection - popularIssueContribution: CreatedIssueContribution + popularIssueContribution: CreatedIssueContribution - popularPullRequestContribution: CreatedPullRequestContribution + popularPullRequestContribution: CreatedPullRequestContribution - pullRequestContributions( - after: String + pullRequestContributions( + after: String - before: String + before: String - excludeFirst: Boolean = false + excludeFirst: Boolean = false - excludePopular: Boolean = false + excludePopular: Boolean = false - first: Int + first: Int - last: Int + last: Int - orderBy: ContributionOrder = {field: OCCURRED_AT, direction: DESC} - ): CreatedPullRequestContributionConnection! + orderBy: ContributionOrder = {field: OCCURRED_AT, direction: DESC} + ): CreatedPullRequestContributionConnection! - pullRequestContributionsByRepository( - excludeFirst: Boolean = false + pullRequestContributionsByRepository( + excludeFirst: Boolean = false - excludePopular: Boolean = false + excludePopular: Boolean = false - maxRepositories: Int = 25 - ): [PullRequestContributionsByRepository!]! + maxRepositories: Int = 25 + ): [PullRequestContributionsByRepository!]! - pullRequestReviewContributions( - after: String + pullRequestReviewContributions( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: ContributionOrder = {field: OCCURRED_AT, direction: DESC} - ): CreatedPullRequestReviewContributionConnection! + orderBy: ContributionOrder = {field: OCCURRED_AT, direction: DESC} + ): CreatedPullRequestReviewContributionConnection! - pullRequestReviewContributionsByRepository( - maxRepositories: Int = 25 - ): [PullRequestReviewContributionsByRepository!]! + pullRequestReviewContributionsByRepository( + maxRepositories: Int = 25 + ): [PullRequestReviewContributionsByRepository!]! - repositoryContributions( - after: String + repositoryContributions( + after: String - before: String + before: String - excludeFirst: Boolean = false + excludeFirst: Boolean = false - first: Int + first: Int - last: Int + last: Int - orderBy: ContributionOrder = {field: OCCURRED_AT, direction: DESC} - ): CreatedRepositoryContributionConnection! + orderBy: ContributionOrder = {field: OCCURRED_AT, direction: DESC} + ): CreatedRepositoryContributionConnection! - restrictedContributionsCount: Int! + restrictedContributionsCount: Int! - startedAt: DateTime! + startedAt: DateTime! - totalCommitContributions: Int! + totalCommitContributions: Int! - totalIssueContributions( - excludeFirst: Boolean = false + totalIssueContributions( + excludeFirst: Boolean = false - excludePopular: Boolean = false - ): Int! + excludePopular: Boolean = false + ): Int! - totalPullRequestContributions( - excludeFirst: Boolean = false + totalPullRequestContributions( + excludeFirst: Boolean = false - excludePopular: Boolean = false - ): Int! + excludePopular: Boolean = false + ): Int! - totalPullRequestReviewContributions: Int! + totalPullRequestReviewContributions: Int! - totalRepositoriesWithContributedCommits: Int! + totalRepositoriesWithContributedCommits: Int! - totalRepositoriesWithContributedIssues( - excludeFirst: Boolean = false + totalRepositoriesWithContributedIssues( + excludeFirst: Boolean = false - excludePopular: Boolean = false - ): Int! + excludePopular: Boolean = false + ): Int! - totalRepositoriesWithContributedPullRequestReviews: Int! + totalRepositoriesWithContributedPullRequestReviews: Int! - totalRepositoriesWithContributedPullRequests( - excludeFirst: Boolean = false + totalRepositoriesWithContributedPullRequests( + excludeFirst: Boolean = false - excludePopular: Boolean = false - ): Int! + excludePopular: Boolean = false + ): Int! - totalRepositoryContributions( - excludeFirst: Boolean = false - ): Int! + totalRepositoryContributions( + excludeFirst: Boolean = false + ): Int! - user: User! + user: User! } input ConvertProjectCardNoteToIssueInput { - body: String + body: String - clientMutationId: String + clientMutationId: String - projectCardId: ID! + projectCardId: ID! - repositoryId: ID! + repositoryId: ID! - title: String + title: String } type ConvertProjectCardNoteToIssuePayload { - clientMutationId: String + clientMutationId: String - projectCard: ProjectCard + projectCard: ProjectCard } type ConvertedNoteToIssueEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! + createdAt: DateTime! - databaseId: Int - id: ID! + databaseId: Int + id: ID! } input CreateBranchProtectionRuleInput { - clientMutationId: String + clientMutationId: String - dismissesStaleReviews: Boolean + dismissesStaleReviews: Boolean - isAdminEnforced: Boolean + isAdminEnforced: Boolean - pattern: String! + pattern: String! - pushActorIds: [ID!] + pushActorIds: [ID!] - repositoryId: ID! + repositoryId: ID! - requiredApprovingReviewCount: Int + requiredApprovingReviewCount: Int - requiredStatusCheckContexts: [String!] + requiredStatusCheckContexts: [String!] - requiresApprovingReviews: Boolean + requiresApprovingReviews: Boolean - requiresCodeOwnerReviews: Boolean + requiresCodeOwnerReviews: Boolean - requiresCommitSignatures: Boolean + requiresCommitSignatures: Boolean - requiresStatusChecks: Boolean + requiresStatusChecks: Boolean - requiresStrictStatusChecks: Boolean + requiresStrictStatusChecks: Boolean - restrictsPushes: Boolean + restrictsPushes: Boolean - restrictsReviewDismissals: Boolean + restrictsReviewDismissals: Boolean - reviewDismissalActorIds: [ID!] + reviewDismissalActorIds: [ID!] } type CreateBranchProtectionRulePayload { - branchProtectionRule: BranchProtectionRule + branchProtectionRule: BranchProtectionRule - clientMutationId: String + clientMutationId: String } input CreateContentAttachmentInput { - body: String! + body: String! - clientMutationId: String + clientMutationId: String - contentReferenceId: ID! + contentReferenceId: ID! - title: String! + title: String! } input CreateIssueInput { - assigneeIds: [ID!] + assigneeIds: [ID!] - body: String + body: String - clientMutationId: String + clientMutationId: String - labelIds: [ID!] + labelIds: [ID!] - milestoneId: ID + milestoneId: ID - projectIds: [ID!] + projectIds: [ID!] - repositoryId: ID! + repositoryId: ID! - title: String! + title: String! } type CreateIssuePayload { - clientMutationId: String + clientMutationId: String - issue: Issue + issue: Issue } input CreateProjectInput { - body: String + body: String - clientMutationId: String + clientMutationId: String - name: String! + name: String! - ownerId: ID! + ownerId: ID! - repositoryIds: [ID!] + repositoryIds: [ID!] - template: ProjectTemplate + template: ProjectTemplate } type CreateProjectPayload { - clientMutationId: String + clientMutationId: String - project: Project + project: Project } input CreatePullRequestInput { - baseRefName: String! + baseRefName: String! - body: String + body: String - clientMutationId: String + clientMutationId: String - headRefName: String! + headRefName: String! - maintainerCanModify: Boolean = true + maintainerCanModify: Boolean = true - repositoryId: ID! + repositoryId: ID! - title: String! + title: String! } type CreatePullRequestPayload { - clientMutationId: String + clientMutationId: String - pullRequest: PullRequest + pullRequest: PullRequest } input CreateRefInput { - clientMutationId: String + clientMutationId: String - name: String! + name: String! - oid: GitObjectID! + oid: GitObjectID! - repositoryId: ID! + repositoryId: ID! } type CreateRefPayload { - clientMutationId: String + clientMutationId: String - ref: Ref + ref: Ref } input CreateRepositoryInput { - clientMutationId: String + clientMutationId: String - description: String + description: String - hasIssuesEnabled: Boolean = true + hasIssuesEnabled: Boolean = true - hasWikiEnabled: Boolean = false + hasWikiEnabled: Boolean = false - homepageUrl: URI + homepageUrl: URI - name: String! + name: String! - ownerId: ID + ownerId: ID - teamId: ID + teamId: ID - template: Boolean = false + template: Boolean = false - visibility: RepositoryVisibility! + visibility: RepositoryVisibility! } type CreateRepositoryPayload { - clientMutationId: String + clientMutationId: String - repository: Repository + repository: Repository } type CreatedCommitContribution implements Contribution { - commitCount: Int! + commitCount: Int! - isRestricted: Boolean! + isRestricted: Boolean! - occurredAt: DateTime! + occurredAt: DateTime! - repository: Repository! + repository: Repository! - resourcePath: URI! + resourcePath: URI! - url: URI! + url: URI! - user: User! + user: User! } type CreatedCommitContributionConnection { - edges: [CreatedCommitContributionEdge] + edges: [CreatedCommitContributionEdge] - nodes: [CreatedCommitContribution] + nodes: [CreatedCommitContribution] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type CreatedCommitContributionEdge { - cursor: String! + cursor: String! - node: CreatedCommitContribution + node: CreatedCommitContribution } type CreatedIssueContribution implements Contribution { - isRestricted: Boolean! + isRestricted: Boolean! - issue: Issue! + issue: Issue! - occurredAt: DateTime! + occurredAt: DateTime! - resourcePath: URI! + resourcePath: URI! - url: URI! + url: URI! - user: User! + user: User! } type CreatedIssueContributionConnection { - edges: [CreatedIssueContributionEdge] + edges: [CreatedIssueContributionEdge] - nodes: [CreatedIssueContribution] + nodes: [CreatedIssueContribution] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type CreatedIssueContributionEdge { - cursor: String! + cursor: String! - node: CreatedIssueContribution + node: CreatedIssueContribution } union CreatedIssueOrRestrictedContribution = CreatedIssueContribution | RestrictedContribution type CreatedPullRequestContribution implements Contribution { - isRestricted: Boolean! + isRestricted: Boolean! - occurredAt: DateTime! + occurredAt: DateTime! - pullRequest: PullRequest! + pullRequest: PullRequest! - resourcePath: URI! + resourcePath: URI! - url: URI! + url: URI! - user: User! + user: User! } type CreatedPullRequestContributionConnection { - edges: [CreatedPullRequestContributionEdge] + edges: [CreatedPullRequestContributionEdge] - nodes: [CreatedPullRequestContribution] + nodes: [CreatedPullRequestContribution] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type CreatedPullRequestContributionEdge { - cursor: String! + cursor: String! - node: CreatedPullRequestContribution + node: CreatedPullRequestContribution } union CreatedPullRequestOrRestrictedContribution = CreatedPullRequestContribution | RestrictedContribution type CreatedPullRequestReviewContribution implements Contribution { - isRestricted: Boolean! + isRestricted: Boolean! - occurredAt: DateTime! + occurredAt: DateTime! - pullRequest: PullRequest! + pullRequest: PullRequest! - pullRequestReview: PullRequestReview! + pullRequestReview: PullRequestReview! - repository: Repository! + repository: Repository! - resourcePath: URI! + resourcePath: URI! - url: URI! + url: URI! - user: User! + user: User! } type CreatedPullRequestReviewContributionConnection { - edges: [CreatedPullRequestReviewContributionEdge] + edges: [CreatedPullRequestReviewContributionEdge] - nodes: [CreatedPullRequestReviewContribution] + nodes: [CreatedPullRequestReviewContribution] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type CreatedPullRequestReviewContributionEdge { - cursor: String! + cursor: String! - node: CreatedPullRequestReviewContribution + node: CreatedPullRequestReviewContribution } type CreatedRepositoryContribution implements Contribution { - isRestricted: Boolean! + isRestricted: Boolean! - occurredAt: DateTime! + occurredAt: DateTime! - repository: Repository! + repository: Repository! - resourcePath: URI! + resourcePath: URI! - url: URI! + url: URI! - user: User! + user: User! } type CreatedRepositoryContributionConnection { - edges: [CreatedRepositoryContributionEdge] + edges: [CreatedRepositoryContributionEdge] - nodes: [CreatedRepositoryContribution] + nodes: [CreatedRepositoryContribution] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type CreatedRepositoryContributionEdge { - cursor: String! + cursor: String! - node: CreatedRepositoryContribution + node: CreatedRepositoryContribution } union CreatedRepositoryOrRestrictedContribution = CreatedRepositoryContribution | RestrictedContribution type CrossReferencedEvent implements Node & UniformResourceLocatable { - actor: Actor + actor: Actor - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - isCrossRepository: Boolean! + isCrossRepository: Boolean! - referencedAt: DateTime! + referencedAt: DateTime! - resourcePath: URI! + resourcePath: URI! - source: ReferencedSubject! + source: ReferencedSubject! - target: ReferencedSubject! + target: ReferencedSubject! - url: URI! + url: URI! - willCloseTarget: Boolean! + willCloseTarget: Boolean! } scalar Date @@ -1591,659 +1590,659 @@ scalar Date scalar DateTime input DeclineTopicSuggestionInput { - clientMutationId: String + clientMutationId: String - name: String! + name: String! - reason: TopicSuggestionDeclineReason! + reason: TopicSuggestionDeclineReason! - repositoryId: ID! + repositoryId: ID! } type DeclineTopicSuggestionPayload { - clientMutationId: String + clientMutationId: String - topic: Topic + topic: Topic } enum DefaultRepositoryPermissionField { - ADMIN + ADMIN - NONE + NONE - READ + READ - WRITE + WRITE } interface Deletable { - viewerCanDelete: Boolean! + viewerCanDelete: Boolean! } input DeleteBranchProtectionRuleInput { - branchProtectionRuleId: ID! + branchProtectionRuleId: ID! - clientMutationId: String + clientMutationId: String } type DeleteBranchProtectionRulePayload { - clientMutationId: String + clientMutationId: String } input DeleteIssueCommentInput { - clientMutationId: String + clientMutationId: String - id: ID! + id: ID! } type DeleteIssueCommentPayload { - clientMutationId: String + clientMutationId: String } input DeleteIssueInput { - clientMutationId: String + clientMutationId: String - issueId: ID! + issueId: ID! } type DeleteIssuePayload { - clientMutationId: String + clientMutationId: String - repository: Repository + repository: Repository } input DeleteProjectCardInput { - cardId: ID! + cardId: ID! - clientMutationId: String + clientMutationId: String } type DeleteProjectCardPayload { - clientMutationId: String + clientMutationId: String - column: ProjectColumn + column: ProjectColumn - deletedCardId: ID + deletedCardId: ID } input DeleteProjectColumnInput { - clientMutationId: String + clientMutationId: String - columnId: ID! + columnId: ID! } type DeleteProjectColumnPayload { - clientMutationId: String + clientMutationId: String - deletedColumnId: ID + deletedColumnId: ID - project: Project + project: Project } input DeleteProjectInput { - clientMutationId: String + clientMutationId: String - projectId: ID! + projectId: ID! } type DeleteProjectPayload { - clientMutationId: String + clientMutationId: String - owner: ProjectOwner + owner: ProjectOwner } input DeletePullRequestReviewCommentInput { - clientMutationId: String + clientMutationId: String - id: ID! + id: ID! } type DeletePullRequestReviewCommentPayload { - clientMutationId: String + clientMutationId: String - pullRequestReview: PullRequestReview + pullRequestReview: PullRequestReview } input DeletePullRequestReviewInput { - clientMutationId: String + clientMutationId: String - pullRequestReviewId: ID! + pullRequestReviewId: ID! } type DeletePullRequestReviewPayload { - clientMutationId: String + clientMutationId: String - pullRequestReview: PullRequestReview + pullRequestReview: PullRequestReview } input DeleteRefInput { - clientMutationId: String + clientMutationId: String - refId: ID! + refId: ID! } type DeleteRefPayload { - clientMutationId: String + clientMutationId: String } type DemilestonedEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - milestoneTitle: String! + milestoneTitle: String! - subject: MilestoneItem! + subject: MilestoneItem! } type DeployKey implements Node { - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - key: String! + key: String! - readOnly: Boolean! + readOnly: Boolean! - title: String! + title: String! - verified: Boolean! + verified: Boolean! } type DeployKeyConnection { - edges: [DeployKeyEdge] + edges: [DeployKeyEdge] - nodes: [DeployKey] + nodes: [DeployKey] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type DeployKeyEdge { - cursor: String! + cursor: String! - node: DeployKey + node: DeployKey } type DeployedEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! + createdAt: DateTime! - databaseId: Int + databaseId: Int - deployment: Deployment! - id: ID! + deployment: Deployment! + id: ID! - pullRequest: PullRequest! + pullRequest: PullRequest! - ref: Ref + ref: Ref } type Deployment implements Node { - commit: Commit + commit: Commit - commitOid: String! + commitOid: String! - createdAt: DateTime! + createdAt: DateTime! - creator: Actor + creator: Actor - databaseId: Int + databaseId: Int - description: String + description: String - environment: String - id: ID! + environment: String + id: ID! - latestStatus: DeploymentStatus + latestStatus: DeploymentStatus - payload: String + payload: String - ref: Ref + ref: Ref - repository: Repository! + repository: Repository! - state: DeploymentState + state: DeploymentState - statuses( - after: String + statuses( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): DeploymentStatusConnection + last: Int + ): DeploymentStatusConnection - task: String + task: String - updatedAt: DateTime! + updatedAt: DateTime! } type DeploymentConnection { - edges: [DeploymentEdge] + edges: [DeploymentEdge] - nodes: [Deployment] + nodes: [Deployment] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type DeploymentEdge { - cursor: String! + cursor: String! - node: Deployment + node: Deployment } type DeploymentEnvironmentChangedEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! + createdAt: DateTime! - deploymentStatus: DeploymentStatus! - id: ID! + deploymentStatus: DeploymentStatus! + id: ID! - pullRequest: PullRequest! + pullRequest: PullRequest! } input DeploymentOrder { - direction: OrderDirection! + direction: OrderDirection! - field: DeploymentOrderField! + field: DeploymentOrderField! } enum DeploymentOrderField { - CREATED_AT + CREATED_AT } enum DeploymentState { - ABANDONED + ABANDONED - ACTIVE + ACTIVE - DESTROYED + DESTROYED - ERROR + ERROR - FAILURE + FAILURE - INACTIVE + INACTIVE - IN_PROGRESS + IN_PROGRESS - PENDING + PENDING - QUEUED + QUEUED } type DeploymentStatus implements Node { - createdAt: DateTime! + createdAt: DateTime! - creator: Actor + creator: Actor - deployment: Deployment! + deployment: Deployment! - description: String + description: String - environmentUrl: URI - id: ID! + environmentUrl: URI + id: ID! - logUrl: URI + logUrl: URI - state: DeploymentStatusState! + state: DeploymentStatusState! - updatedAt: DateTime! + updatedAt: DateTime! } type DeploymentStatusConnection { - edges: [DeploymentStatusEdge] + edges: [DeploymentStatusEdge] - nodes: [DeploymentStatus] + nodes: [DeploymentStatus] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type DeploymentStatusEdge { - cursor: String! + cursor: String! - node: DeploymentStatus + node: DeploymentStatus } enum DeploymentStatusState { - ERROR + ERROR - FAILURE + FAILURE - INACTIVE + INACTIVE - IN_PROGRESS + IN_PROGRESS - PENDING + PENDING - QUEUED + QUEUED - SUCCESS + SUCCESS } input DismissPullRequestReviewInput { - clientMutationId: String + clientMutationId: String - message: String! + message: String! - pullRequestReviewId: ID! + pullRequestReviewId: ID! } type DismissPullRequestReviewPayload { - clientMutationId: String + clientMutationId: String - pullRequestReview: PullRequestReview + pullRequestReview: PullRequestReview } input DraftPullRequestReviewComment { - body: String! + body: String! - path: String! + path: String! - position: Int! + position: Int! } type ExternalIdentity implements Node { - guid: String! - id: ID! + guid: String! + id: ID! - organizationInvitation: OrganizationInvitation + organizationInvitation: OrganizationInvitation - samlIdentity: ExternalIdentitySamlAttributes + samlIdentity: ExternalIdentitySamlAttributes - scimIdentity: ExternalIdentityScimAttributes + scimIdentity: ExternalIdentityScimAttributes - user: User + user: User } type ExternalIdentityConnection { - edges: [ExternalIdentityEdge] + edges: [ExternalIdentityEdge] - nodes: [ExternalIdentity] + nodes: [ExternalIdentity] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type ExternalIdentityEdge { - cursor: String! + cursor: String! - node: ExternalIdentity + node: ExternalIdentity } type ExternalIdentitySamlAttributes { - nameId: String + nameId: String } type ExternalIdentityScimAttributes { - username: String + username: String } type FollowerConnection { - edges: [UserEdge] + edges: [UserEdge] - nodes: [User] + nodes: [User] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type FollowingConnection { - edges: [UserEdge] + edges: [UserEdge] - nodes: [User] + nodes: [User] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type Gist implements Node & Starrable & UniformResourceLocatable { - comments( - after: String + comments( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): GistCommentConnection! + last: Int + ): GistCommentConnection! - createdAt: DateTime! + createdAt: DateTime! - description: String + description: String - files( - limit: Int = 10 + files( + limit: Int = 10 - oid: GitObjectID - ): [GistFile] + oid: GitObjectID + ): [GistFile] - forks( - after: String + forks( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: GistOrder - ): GistConnection! - id: ID! + orderBy: GistOrder + ): GistConnection! + id: ID! - isFork: Boolean! + isFork: Boolean! - isPublic: Boolean! + isPublic: Boolean! - name: String! + name: String! - owner: RepositoryOwner + owner: RepositoryOwner - pushedAt: DateTime + pushedAt: DateTime - resourcePath: URI! + resourcePath: URI! - stargazers( - after: String + stargazers( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: StarOrder - ): StargazerConnection! + orderBy: StarOrder + ): StargazerConnection! - updatedAt: DateTime! + updatedAt: DateTime! - url: URI! + url: URI! - viewerHasStarred: Boolean! + viewerHasStarred: Boolean! } type GistComment implements Comment & Deletable & Node & Updatable & UpdatableComment { - author: Actor + author: Actor - authorAssociation: CommentAuthorAssociation! + authorAssociation: CommentAuthorAssociation! - body: String! + body: String! - bodyHTML: HTML! + bodyHTML: HTML! - bodyText: String! + bodyText: String! - createdAt: DateTime! + createdAt: DateTime! - createdViaEmail: Boolean! + createdViaEmail: Boolean! - databaseId: Int + databaseId: Int - editor: Actor + editor: Actor - gist: Gist! - id: ID! + gist: Gist! + id: ID! - includesCreatedEdit: Boolean! + includesCreatedEdit: Boolean! - isMinimized: Boolean! + isMinimized: Boolean! - lastEditedAt: DateTime + lastEditedAt: DateTime - minimizedReason: String + minimizedReason: String - publishedAt: DateTime + publishedAt: DateTime - updatedAt: DateTime! + updatedAt: DateTime! - userContentEdits( - after: String + userContentEdits( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): UserContentEditConnection + last: Int + ): UserContentEditConnection - viewerCanDelete: Boolean! + viewerCanDelete: Boolean! - viewerCanMinimize: Boolean! + viewerCanMinimize: Boolean! - viewerCanUpdate: Boolean! + viewerCanUpdate: Boolean! - viewerCannotUpdateReasons: [CommentCannotUpdateReason!]! + viewerCannotUpdateReasons: [CommentCannotUpdateReason!]! - viewerDidAuthor: Boolean! + viewerDidAuthor: Boolean! } type GistCommentConnection { - edges: [GistCommentEdge] + edges: [GistCommentEdge] - nodes: [GistComment] + nodes: [GistComment] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type GistCommentEdge { - cursor: String! + cursor: String! - node: GistComment + node: GistComment } type GistConnection { - edges: [GistEdge] + edges: [GistEdge] - nodes: [Gist] + nodes: [Gist] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type GistEdge { - cursor: String! + cursor: String! - node: Gist + node: Gist } type GistFile { - encodedName: String + encodedName: String - encoding: String + encoding: String - extension: String + extension: String - isImage: Boolean! + isImage: Boolean! - isTruncated: Boolean! + isTruncated: Boolean! - language: Language + language: Language - name: String + name: String - size: Int + size: Int - text( - truncate: Int - ): String + text( + truncate: Int + ): String } input GistOrder { - direction: OrderDirection! + direction: OrderDirection! - field: GistOrderField! + field: GistOrderField! } enum GistOrderField { - CREATED_AT + CREATED_AT - PUSHED_AT + PUSHED_AT - UPDATED_AT + UPDATED_AT } enum GistPrivacy { - ALL + ALL - PUBLIC + PUBLIC - SECRET + SECRET } type GitActor { - avatarUrl( - size: Int - ): URI! + avatarUrl( + size: Int + ): URI! - date: GitTimestamp + date: GitTimestamp - email: String + email: String - name: String + name: String - user: User + user: User } type GitHubMetadata { - gitHubServicesSha: GitObjectID! + gitHubServicesSha: GitObjectID! - gitIpAddresses: [String!] + gitIpAddresses: [String!] - hookIpAddresses: [String!] + hookIpAddresses: [String!] - importerIpAddresses: [String!] + importerIpAddresses: [String!] - isPasswordAuthenticationVerifiable: Boolean! + isPasswordAuthenticationVerifiable: Boolean! - pagesIpAddresses: [String!] + pagesIpAddresses: [String!] } interface GitObject { - abbreviatedOid: String! + abbreviatedOid: String! - commitResourcePath: URI! + commitResourcePath: URI! - commitUrl: URI! - id: ID! + commitUrl: URI! + id: ID! - oid: GitObjectID! + oid: GitObjectID! - repository: Repository! + repository: Repository! } scalar GitObjectID @@ -2251,6749 +2250,6749 @@ scalar GitObjectID scalar GitSSHRemote interface GitSignature { - email: String! + email: String! - isValid: Boolean! + isValid: Boolean! - payload: String! + payload: String! - signature: String! + signature: String! - signer: User + signer: User - state: GitSignatureState! + state: GitSignatureState! - wasSignedByGitHub: Boolean! + wasSignedByGitHub: Boolean! } enum GitSignatureState { - BAD_CERT + BAD_CERT - BAD_EMAIL + BAD_EMAIL - EXPIRED_KEY + EXPIRED_KEY - GPGVERIFY_ERROR + GPGVERIFY_ERROR - GPGVERIFY_UNAVAILABLE + GPGVERIFY_UNAVAILABLE - INVALID + INVALID - MALFORMED_SIG + MALFORMED_SIG - NOT_SIGNING_KEY + NOT_SIGNING_KEY - NO_USER + NO_USER - OCSP_ERROR + OCSP_ERROR - OCSP_PENDING + OCSP_PENDING - OCSP_REVOKED + OCSP_REVOKED - UNKNOWN_KEY + UNKNOWN_KEY - UNKNOWN_SIG_TYPE + UNKNOWN_SIG_TYPE - UNSIGNED + UNSIGNED - UNVERIFIED_EMAIL + UNVERIFIED_EMAIL - VALID + VALID } scalar GitTimestamp type GpgSignature implements GitSignature { - email: String! + email: String! - isValid: Boolean! + isValid: Boolean! - keyId: String + keyId: String - payload: String! + payload: String! - signature: String! + signature: String! - signer: User + signer: User - state: GitSignatureState! + state: GitSignatureState! - wasSignedByGitHub: Boolean! + wasSignedByGitHub: Boolean! } scalar HTML type HeadRefDeletedEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! + createdAt: DateTime! - headRef: Ref + headRef: Ref - headRefName: String! - id: ID! + headRefName: String! + id: ID! - pullRequest: PullRequest! + pullRequest: PullRequest! } type HeadRefForcePushedEvent implements Node { - actor: Actor + actor: Actor - afterCommit: Commit + afterCommit: Commit - beforeCommit: Commit + beforeCommit: Commit - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - pullRequest: PullRequest! + pullRequest: PullRequest! - ref: Ref + ref: Ref } type HeadRefRestoredEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - pullRequest: PullRequest! + pullRequest: PullRequest! } enum IdentityProviderConfigurationState { - CONFIGURED + CONFIGURED - ENFORCED + ENFORCED - UNCONFIGURED + UNCONFIGURED } input ImportProjectInput { - body: String + body: String - clientMutationId: String + clientMutationId: String - columnImports: [ProjectColumnImport!]! + columnImports: [ProjectColumnImport!]! - name: String! + name: String! - ownerName: String! + ownerName: String! - public: Boolean = false + public: Boolean = false } type Issue implements Assignable & Closable & Comment & Labelable & Lockable & Node & Reactable & RepositoryNode & Subscribable & UniformResourceLocatable & Updatable & UpdatableComment { - activeLockReason: LockReason + activeLockReason: LockReason - assignees( - after: String + assignees( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): UserConnection! + last: Int + ): UserConnection! - author: Actor + author: Actor - authorAssociation: CommentAuthorAssociation! + authorAssociation: CommentAuthorAssociation! - body: String! + body: String! - bodyHTML: HTML! + bodyHTML: HTML! - bodyText: String! + bodyText: String! - closed: Boolean! + closed: Boolean! - closedAt: DateTime + closedAt: DateTime - comments( - after: String + comments( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): IssueCommentConnection! + last: Int + ): IssueCommentConnection! - createdAt: DateTime! + createdAt: DateTime! - createdViaEmail: Boolean! + createdViaEmail: Boolean! - databaseId: Int + databaseId: Int - editor: Actor - id: ID! + editor: Actor + id: ID! - includesCreatedEdit: Boolean! + includesCreatedEdit: Boolean! - labels( - after: String + labels( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): LabelConnection + last: Int + ): LabelConnection - lastEditedAt: DateTime + lastEditedAt: DateTime - locked: Boolean! + locked: Boolean! - milestone: Milestone + milestone: Milestone - number: Int! + number: Int! - participants( - after: String + participants( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): UserConnection! + last: Int + ): UserConnection! - projectCards( - after: String + projectCards( + after: String - archivedStates: [ProjectCardArchivedState] = [ARCHIVED, NOT_ARCHIVED] + archivedStates: [ProjectCardArchivedState] = [ARCHIVED, NOT_ARCHIVED] - before: String + before: String - first: Int + first: Int - last: Int - ): ProjectCardConnection! + last: Int + ): ProjectCardConnection! - publishedAt: DateTime + publishedAt: DateTime - reactionGroups: [ReactionGroup!] + reactionGroups: [ReactionGroup!] - reactions( - after: String + reactions( + after: String - before: String + before: String - content: ReactionContent + content: ReactionContent - first: Int + first: Int - last: Int + last: Int - orderBy: ReactionOrder - ): ReactionConnection! + orderBy: ReactionOrder + ): ReactionConnection! - repository: Repository! + repository: Repository! - resourcePath: URI! + resourcePath: URI! - state: IssueState! + state: IssueState! - timeline( - after: String + timeline( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - since: DateTime - ): IssueTimelineConnection! @deprecated(reason: "`timeline` will be removed Use Issue.timelineItems instead. Removal on 2019-10-01 UTC.") + since: DateTime + ): IssueTimelineConnection! @deprecated(reason: "`timeline` will be removed Use Issue.timelineItems instead. Removal on 2019-10-01 UTC.") - timelineItems( - after: String + timelineItems( + after: String - before: String + before: String - first: Int + first: Int - itemTypes: [IssueTimelineItemsItemType!] + itemTypes: [IssueTimelineItemsItemType!] - last: Int + last: Int - since: DateTime + since: DateTime - skip: Int - ): IssueTimelineItemsConnection! + skip: Int + ): IssueTimelineItemsConnection! - title: String! + title: String! - updatedAt: DateTime! + updatedAt: DateTime! - url: URI! + url: URI! - userContentEdits( - after: String + userContentEdits( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): UserContentEditConnection + last: Int + ): UserContentEditConnection - viewerCanReact: Boolean! + viewerCanReact: Boolean! - viewerCanSubscribe: Boolean! + viewerCanSubscribe: Boolean! - viewerCanUpdate: Boolean! + viewerCanUpdate: Boolean! - viewerCannotUpdateReasons: [CommentCannotUpdateReason!]! + viewerCannotUpdateReasons: [CommentCannotUpdateReason!]! - viewerDidAuthor: Boolean! + viewerDidAuthor: Boolean! - viewerSubscription: SubscriptionState + viewerSubscription: SubscriptionState } type IssueComment implements Comment & Deletable & Node & Reactable & RepositoryNode & Updatable & UpdatableComment { - author: Actor + author: Actor - authorAssociation: CommentAuthorAssociation! + authorAssociation: CommentAuthorAssociation! - body: String! + body: String! - bodyHTML: HTML! + bodyHTML: HTML! - bodyText: String! + bodyText: String! - createdAt: DateTime! + createdAt: DateTime! - createdViaEmail: Boolean! + createdViaEmail: Boolean! - databaseId: Int + databaseId: Int - editor: Actor - id: ID! + editor: Actor + id: ID! - includesCreatedEdit: Boolean! + includesCreatedEdit: Boolean! - isMinimized: Boolean! + isMinimized: Boolean! - issue: Issue! + issue: Issue! - lastEditedAt: DateTime + lastEditedAt: DateTime - minimizedReason: String + minimizedReason: String - publishedAt: DateTime + publishedAt: DateTime - pullRequest: PullRequest + pullRequest: PullRequest - reactionGroups: [ReactionGroup!] + reactionGroups: [ReactionGroup!] - reactions( - after: String + reactions( + after: String - before: String + before: String - content: ReactionContent + content: ReactionContent - first: Int + first: Int - last: Int + last: Int - orderBy: ReactionOrder - ): ReactionConnection! + orderBy: ReactionOrder + ): ReactionConnection! - repository: Repository! + repository: Repository! - resourcePath: URI! + resourcePath: URI! - updatedAt: DateTime! + updatedAt: DateTime! - url: URI! + url: URI! - userContentEdits( - after: String + userContentEdits( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): UserContentEditConnection + last: Int + ): UserContentEditConnection - viewerCanDelete: Boolean! + viewerCanDelete: Boolean! - viewerCanMinimize: Boolean! + viewerCanMinimize: Boolean! - viewerCanReact: Boolean! + viewerCanReact: Boolean! - viewerCanUpdate: Boolean! + viewerCanUpdate: Boolean! - viewerCannotUpdateReasons: [CommentCannotUpdateReason!]! + viewerCannotUpdateReasons: [CommentCannotUpdateReason!]! - viewerDidAuthor: Boolean! + viewerDidAuthor: Boolean! } type IssueCommentConnection { - edges: [IssueCommentEdge] + edges: [IssueCommentEdge] - nodes: [IssueComment] + nodes: [IssueComment] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type IssueCommentEdge { - cursor: String! + cursor: String! - node: IssueComment + node: IssueComment } type IssueConnection { - edges: [IssueEdge] + edges: [IssueEdge] - nodes: [Issue] + nodes: [Issue] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type IssueContributionsByRepository { - contributions( - after: String + contributions( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: ContributionOrder = {field: OCCURRED_AT, direction: DESC} - ): CreatedIssueContributionConnection! + orderBy: ContributionOrder = {field: OCCURRED_AT, direction: DESC} + ): CreatedIssueContributionConnection! - repository: Repository! + repository: Repository! } type IssueEdge { - cursor: String! + cursor: String! - node: Issue + node: Issue } input IssueFilters { - assignee: String + assignee: String - createdBy: String + createdBy: String - labels: [String!] + labels: [String!] - mentioned: String + mentioned: String - milestone: String + milestone: String - since: DateTime + since: DateTime - states: [IssueState!] + states: [IssueState!] - viewerSubscribed: Boolean = false + viewerSubscribed: Boolean = false } union IssueOrPullRequest = Issue | PullRequest type IssueOrPullRequestEdge { - cursor: String! + cursor: String! - node: IssueOrPullRequest + node: IssueOrPullRequest } input IssueOrder { - direction: OrderDirection! + direction: OrderDirection! - field: IssueOrderField! + field: IssueOrderField! } enum IssueOrderField { - COMMENTS + COMMENTS - CREATED_AT + CREATED_AT - UPDATED_AT + UPDATED_AT } enum IssuePubSubTopic { - MARKASREAD + MARKASREAD - STATE + STATE - TIMELINE + TIMELINE - UPDATED + UPDATED } enum IssueState { - CLOSED + CLOSED - OPEN + OPEN } type IssueTimelineConnection { - edges: [IssueTimelineItemEdge] + edges: [IssueTimelineItemEdge] - nodes: [IssueTimelineItem] + nodes: [IssueTimelineItem] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } union IssueTimelineItem = AssignedEvent | ClosedEvent | Commit | CrossReferencedEvent | DemilestonedEvent | IssueComment | LabeledEvent | LockedEvent | MilestonedEvent | ReferencedEvent | RenamedTitleEvent | ReopenedEvent | SubscribedEvent | TransferredEvent | UnassignedEvent | UnlabeledEvent | UnlockedEvent | UnsubscribedEvent | UserBlockedEvent type IssueTimelineItemEdge { - cursor: String! + cursor: String! - node: IssueTimelineItem + node: IssueTimelineItem } union IssueTimelineItems = AddedToProjectEvent | AssignedEvent | ClosedEvent | CommentDeletedEvent | ConvertedNoteToIssueEvent | CrossReferencedEvent | DemilestonedEvent | IssueComment | LabeledEvent | LockedEvent | MarkedAsDuplicateEvent | MentionedEvent | MilestonedEvent | MovedColumnsInProjectEvent | PinnedEvent | ReferencedEvent | RemovedFromProjectEvent | RenamedTitleEvent | ReopenedEvent | SubscribedEvent | TransferredEvent | UnassignedEvent | UnlabeledEvent | UnlockedEvent | UnpinnedEvent | UnsubscribedEvent | UserBlockedEvent type IssueTimelineItemsConnection { - edges: [IssueTimelineItemsEdge] + edges: [IssueTimelineItemsEdge] - filteredCount: Int! + filteredCount: Int! - nodes: [IssueTimelineItems] + nodes: [IssueTimelineItems] - pageCount: Int! + pageCount: Int! - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! - updatedAt: DateTime! + updatedAt: DateTime! } type IssueTimelineItemsEdge { - cursor: String! + cursor: String! - node: IssueTimelineItems + node: IssueTimelineItems } enum IssueTimelineItemsItemType { - ADDED_TO_PROJECT_EVENT + ADDED_TO_PROJECT_EVENT - ASSIGNED_EVENT + ASSIGNED_EVENT - CLOSED_EVENT + CLOSED_EVENT - COMMENT_DELETED_EVENT + COMMENT_DELETED_EVENT - CONVERTED_NOTE_TO_ISSUE_EVENT + CONVERTED_NOTE_TO_ISSUE_EVENT - CROSS_REFERENCED_EVENT + CROSS_REFERENCED_EVENT - DEMILESTONED_EVENT + DEMILESTONED_EVENT - ISSUE_COMMENT + ISSUE_COMMENT - LABELED_EVENT + LABELED_EVENT - LOCKED_EVENT + LOCKED_EVENT - MARKED_AS_DUPLICATE_EVENT + MARKED_AS_DUPLICATE_EVENT - MENTIONED_EVENT + MENTIONED_EVENT - MILESTONED_EVENT + MILESTONED_EVENT - MOVED_COLUMNS_IN_PROJECT_EVENT + MOVED_COLUMNS_IN_PROJECT_EVENT - PINNED_EVENT + PINNED_EVENT - REFERENCED_EVENT + REFERENCED_EVENT - REMOVED_FROM_PROJECT_EVENT + REMOVED_FROM_PROJECT_EVENT - RENAMED_TITLE_EVENT + RENAMED_TITLE_EVENT - REOPENED_EVENT + REOPENED_EVENT - SUBSCRIBED_EVENT + SUBSCRIBED_EVENT - TRANSFERRED_EVENT + TRANSFERRED_EVENT - UNASSIGNED_EVENT + UNASSIGNED_EVENT - UNLABELED_EVENT + UNLABELED_EVENT - UNLOCKED_EVENT + UNLOCKED_EVENT - UNPINNED_EVENT + UNPINNED_EVENT - UNSUBSCRIBED_EVENT + UNSUBSCRIBED_EVENT - USER_BLOCKED_EVENT + USER_BLOCKED_EVENT } type JoinedGitHubContribution implements Contribution { - isRestricted: Boolean! + isRestricted: Boolean! - occurredAt: DateTime! + occurredAt: DateTime! - resourcePath: URI! + resourcePath: URI! - url: URI! + url: URI! - user: User! + user: User! } type Label implements Node { - color: String! + color: String! - createdAt: DateTime + createdAt: DateTime - description: String - id: ID! + description: String + id: ID! - isDefault: Boolean! + isDefault: Boolean! - issues( - after: String + issues( + after: String - before: String + before: String - filterBy: IssueFilters + filterBy: IssueFilters - first: Int + first: Int - labels: [String!] + labels: [String!] - last: Int + last: Int - orderBy: IssueOrder + orderBy: IssueOrder - states: [IssueState!] - ): IssueConnection! + states: [IssueState!] + ): IssueConnection! - name: String! + name: String! - pullRequests( - after: String + pullRequests( + after: String - baseRefName: String + baseRefName: String - before: String + before: String - first: Int + first: Int - headRefName: String + headRefName: String - labels: [String!] + labels: [String!] - last: Int + last: Int - orderBy: IssueOrder + orderBy: IssueOrder - states: [PullRequestState!] - ): PullRequestConnection! + states: [PullRequestState!] + ): PullRequestConnection! - repository: Repository! + repository: Repository! - resourcePath: URI! + resourcePath: URI! - updatedAt: DateTime + updatedAt: DateTime - url: URI! + url: URI! } type LabelConnection { - edges: [LabelEdge] + edges: [LabelEdge] - nodes: [Label] + nodes: [Label] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type LabelEdge { - cursor: String! + cursor: String! - node: Label + node: Label } interface Labelable { - labels( - after: String + labels( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): LabelConnection + last: Int + ): LabelConnection } type LabeledEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - label: Label! + label: Label! - labelable: Labelable! + labelable: Labelable! } type Language implements Node { - color: String - id: ID! + color: String + id: ID! - name: String! + name: String! } type LanguageConnection { - edges: [LanguageEdge] + edges: [LanguageEdge] - nodes: [Language] + nodes: [Language] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! - totalSize: Int! + totalSize: Int! } type LanguageEdge { - cursor: String! - node: Language! + cursor: String! + node: Language! - size: Int! + size: Int! } input LanguageOrder { - direction: OrderDirection! + direction: OrderDirection! - field: LanguageOrderField! + field: LanguageOrderField! } enum LanguageOrderField { - SIZE + SIZE } type License implements Node { - body: String! + body: String! - conditions: [LicenseRule]! + conditions: [LicenseRule]! - description: String + description: String - featured: Boolean! + featured: Boolean! - hidden: Boolean! - id: ID! + hidden: Boolean! + id: ID! - implementation: String + implementation: String - key: String! + key: String! - limitations: [LicenseRule]! + limitations: [LicenseRule]! - name: String! + name: String! - nickname: String + nickname: String - permissions: [LicenseRule]! + permissions: [LicenseRule]! - pseudoLicense: Boolean! + pseudoLicense: Boolean! - spdxId: String + spdxId: String - url: URI + url: URI } type LicenseRule { - description: String! + description: String! - key: String! + key: String! - label: String! + label: String! } input LinkRepositoryToProjectInput { - clientMutationId: String + clientMutationId: String - projectId: ID! + projectId: ID! - repositoryId: ID! + repositoryId: ID! } type LinkRepositoryToProjectPayload { - clientMutationId: String + clientMutationId: String - project: Project + project: Project - repository: Repository + repository: Repository } input LockLockableInput { - clientMutationId: String + clientMutationId: String - lockReason: LockReason + lockReason: LockReason - lockableId: ID! + lockableId: ID! } type LockLockablePayload { - clientMutationId: String + clientMutationId: String - lockedRecord: Lockable + lockedRecord: Lockable } enum LockReason { - OFF_TOPIC + OFF_TOPIC - RESOLVED + RESOLVED - SPAM + SPAM - TOO_HEATED + TOO_HEATED } interface Lockable { - activeLockReason: LockReason + activeLockReason: LockReason - locked: Boolean! + locked: Boolean! } type LockedEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - lockReason: LockReason + lockReason: LockReason - lockable: Lockable! + lockable: Lockable! } type Mannequin implements Actor & Node & UniformResourceLocatable { - avatarUrl( - size: Int - ): URI! + avatarUrl( + size: Int + ): URI! - createdAt: DateTime! + createdAt: DateTime! - databaseId: Int - id: ID! + databaseId: Int + id: ID! - login: String! + login: String! - resourcePath: URI! + resourcePath: URI! - updatedAt: DateTime! + updatedAt: DateTime! - url: URI! + url: URI! } type MarkedAsDuplicateEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! } type MarketplaceCategory implements Node { - description: String + description: String - howItWorks: String - id: ID! + howItWorks: String + id: ID! - name: String! + name: String! - primaryListingCount: Int! + primaryListingCount: Int! - resourcePath: URI! + resourcePath: URI! - secondaryListingCount: Int! + secondaryListingCount: Int! - slug: String! + slug: String! - url: URI! + url: URI! } type MarketplaceListing implements Node { - app: App + app: App - companyUrl: URI + companyUrl: URI - configurationResourcePath: URI! + configurationResourcePath: URI! - configurationUrl: URI! + configurationUrl: URI! - documentationUrl: URI + documentationUrl: URI - extendedDescription: String + extendedDescription: String - extendedDescriptionHTML: HTML! + extendedDescriptionHTML: HTML! - fullDescription: String! + fullDescription: String! - fullDescriptionHTML: HTML! + fullDescriptionHTML: HTML! - hasApprovalBeenRequested: Boolean! @deprecated(reason: "`hasApprovalBeenRequested` will be removed. Use `isVerificationPendingFromDraft` instead. Removal on 2019-10-01 UTC.") + hasApprovalBeenRequested: Boolean! @deprecated(reason: "`hasApprovalBeenRequested` will be removed. Use `isVerificationPendingFromDraft` instead. Removal on 2019-10-01 UTC.") - hasPublishedFreeTrialPlans: Boolean! + hasPublishedFreeTrialPlans: Boolean! - hasTermsOfService: Boolean! + hasTermsOfService: Boolean! - howItWorks: String + howItWorks: String - howItWorksHTML: HTML! - id: ID! + howItWorksHTML: HTML! + id: ID! - installationUrl: URI + installationUrl: URI - installedForViewer: Boolean! + installedForViewer: Boolean! - isApproved: Boolean! @deprecated(reason: "`isApproved` will be removed. Use `isPublic` instead. Removal on 2019-10-01 UTC.") + isApproved: Boolean! @deprecated(reason: "`isApproved` will be removed. Use `isPublic` instead. Removal on 2019-10-01 UTC.") - isArchived: Boolean! + isArchived: Boolean! - isDelisted: Boolean! @deprecated(reason: "`isDelisted` will be removed. Use `isArchived` instead. Removal on 2019-10-01 UTC.") + isDelisted: Boolean! @deprecated(reason: "`isDelisted` will be removed. Use `isArchived` instead. Removal on 2019-10-01 UTC.") - isDraft: Boolean! + isDraft: Boolean! - isPaid: Boolean! + isPaid: Boolean! - isPublic: Boolean! + isPublic: Boolean! - isRejected: Boolean! + isRejected: Boolean! - isUnverified: Boolean! + isUnverified: Boolean! - isUnverifiedPending: Boolean! + isUnverifiedPending: Boolean! - isVerificationPendingFromDraft: Boolean! + isVerificationPendingFromDraft: Boolean! - isVerificationPendingFromUnverified: Boolean! + isVerificationPendingFromUnverified: Boolean! - isVerified: Boolean! + isVerified: Boolean! - logoBackgroundColor: String! + logoBackgroundColor: String! - logoUrl( - size: Int = 400 - ): URI + logoUrl( + size: Int = 400 + ): URI - name: String! + name: String! - normalizedShortDescription: String! + normalizedShortDescription: String! - pricingUrl: URI + pricingUrl: URI - primaryCategory: MarketplaceCategory! + primaryCategory: MarketplaceCategory! - privacyPolicyUrl: URI! + privacyPolicyUrl: URI! - resourcePath: URI! + resourcePath: URI! - screenshotUrls: [String]! + screenshotUrls: [String]! - secondaryCategory: MarketplaceCategory + secondaryCategory: MarketplaceCategory - shortDescription: String! + shortDescription: String! - slug: String! + slug: String! - statusUrl: URI + statusUrl: URI - supportEmail: String + supportEmail: String - supportUrl: URI! + supportUrl: URI! - termsOfServiceUrl: URI + termsOfServiceUrl: URI - url: URI! + url: URI! - viewerCanAddPlans: Boolean! + viewerCanAddPlans: Boolean! - viewerCanApprove: Boolean! + viewerCanApprove: Boolean! - viewerCanDelist: Boolean! + viewerCanDelist: Boolean! - viewerCanEdit: Boolean! + viewerCanEdit: Boolean! - viewerCanEditCategories: Boolean! + viewerCanEditCategories: Boolean! - viewerCanEditPlans: Boolean! + viewerCanEditPlans: Boolean! - viewerCanRedraft: Boolean! + viewerCanRedraft: Boolean! - viewerCanReject: Boolean! + viewerCanReject: Boolean! - viewerCanRequestApproval: Boolean! + viewerCanRequestApproval: Boolean! - viewerHasPurchased: Boolean! + viewerHasPurchased: Boolean! - viewerHasPurchasedForAllOrganizations: Boolean! + viewerHasPurchasedForAllOrganizations: Boolean! - viewerIsListingAdmin: Boolean! + viewerIsListingAdmin: Boolean! } type MarketplaceListingConnection { - edges: [MarketplaceListingEdge] + edges: [MarketplaceListingEdge] - nodes: [MarketplaceListing] + nodes: [MarketplaceListing] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type MarketplaceListingEdge { - cursor: String! + cursor: String! - node: MarketplaceListing + node: MarketplaceListing } interface MemberStatusable { - memberStatuses( - after: String + memberStatuses( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: UserStatusOrder = {field: UPDATED_AT, direction: DESC} - ): UserStatusConnection! + orderBy: UserStatusOrder = {field: UPDATED_AT, direction: DESC} + ): UserStatusConnection! } type MentionedEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! + createdAt: DateTime! - databaseId: Int - id: ID! + databaseId: Int + id: ID! } input MergeBranchInput { - base: String! + base: String! - clientMutationId: String + clientMutationId: String - commitMessage: String + commitMessage: String - head: String! + head: String! - repositoryId: ID! + repositoryId: ID! } type MergeBranchPayload { - clientMutationId: String + clientMutationId: String - mergeCommit: Commit + mergeCommit: Commit } input MergePullRequestInput { - clientMutationId: String + clientMutationId: String - commitBody: String + commitBody: String - commitHeadline: String + commitHeadline: String - expectedHeadOid: GitObjectID + expectedHeadOid: GitObjectID - pullRequestId: ID! + pullRequestId: ID! } type MergePullRequestPayload { - clientMutationId: String + clientMutationId: String - pullRequest: PullRequest + pullRequest: PullRequest } enum MergeableState { - CONFLICTING + CONFLICTING - MERGEABLE + MERGEABLE - UNKNOWN + UNKNOWN } type MergedEvent implements Node & UniformResourceLocatable { - actor: Actor + actor: Actor - commit: Commit + commit: Commit - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - mergeRef: Ref + mergeRef: Ref - mergeRefName: String! + mergeRefName: String! - pullRequest: PullRequest! + pullRequest: PullRequest! - resourcePath: URI! + resourcePath: URI! - url: URI! + url: URI! } type Milestone implements Closable & Node & UniformResourceLocatable { - closed: Boolean! + closed: Boolean! - closedAt: DateTime + closedAt: DateTime - createdAt: DateTime! + createdAt: DateTime! - creator: Actor + creator: Actor - description: String + description: String - dueOn: DateTime - id: ID! + dueOn: DateTime + id: ID! - issuePrioritiesDebug: String! + issuePrioritiesDebug: String! - issues( - after: String + issues( + after: String - before: String + before: String - filterBy: IssueFilters + filterBy: IssueFilters - first: Int + first: Int - labels: [String!] + labels: [String!] - last: Int + last: Int - orderBy: IssueOrder + orderBy: IssueOrder - states: [IssueState!] - ): IssueConnection! + states: [IssueState!] + ): IssueConnection! - number: Int! + number: Int! - pullRequests( - after: String + pullRequests( + after: String - baseRefName: String + baseRefName: String - before: String + before: String - first: Int + first: Int - headRefName: String + headRefName: String - labels: [String!] + labels: [String!] - last: Int + last: Int - orderBy: IssueOrder + orderBy: IssueOrder - states: [PullRequestState!] - ): PullRequestConnection! + states: [PullRequestState!] + ): PullRequestConnection! - repository: Repository! + repository: Repository! - resourcePath: URI! + resourcePath: URI! - state: MilestoneState! + state: MilestoneState! - title: String! + title: String! - updatedAt: DateTime! + updatedAt: DateTime! - url: URI! + url: URI! } type MilestoneConnection { - edges: [MilestoneEdge] + edges: [MilestoneEdge] - nodes: [Milestone] + nodes: [Milestone] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type MilestoneEdge { - cursor: String! + cursor: String! - node: Milestone + node: Milestone } union MilestoneItem = Issue | PullRequest input MilestoneOrder { - direction: OrderDirection! + direction: OrderDirection! - field: MilestoneOrderField! + field: MilestoneOrderField! } enum MilestoneOrderField { - CREATED_AT + CREATED_AT - DUE_DATE + DUE_DATE - NUMBER + NUMBER - UPDATED_AT + UPDATED_AT } enum MilestoneState { - CLOSED + CLOSED - OPEN + OPEN } type MilestonedEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - milestoneTitle: String! + milestoneTitle: String! - subject: MilestoneItem! + subject: MilestoneItem! } input MinimizeCommentInput { - classifier: ReportedContentClassifiers! + classifier: ReportedContentClassifiers! - clientMutationId: String + clientMutationId: String - subjectId: ID! + subjectId: ID! } input MoveProjectCardInput { - afterCardId: ID + afterCardId: ID - cardId: ID! + cardId: ID! - clientMutationId: String + clientMutationId: String - columnId: ID! + columnId: ID! } type MoveProjectCardPayload { - cardEdge: ProjectCardEdge + cardEdge: ProjectCardEdge - clientMutationId: String + clientMutationId: String } input MoveProjectColumnInput { - afterColumnId: ID + afterColumnId: ID - clientMutationId: String + clientMutationId: String - columnId: ID! + columnId: ID! } type MoveProjectColumnPayload { - clientMutationId: String + clientMutationId: String - columnEdge: ProjectColumnEdge + columnEdge: ProjectColumnEdge } type MovedColumnsInProjectEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! + createdAt: DateTime! - databaseId: Int - id: ID! + databaseId: Int + id: ID! } type Mutation { - acceptTopicSuggestion(input: AcceptTopicSuggestionInput!): AcceptTopicSuggestionPayload + acceptTopicSuggestion(input: AcceptTopicSuggestionInput!): AcceptTopicSuggestionPayload - addAssigneesToAssignable(input: AddAssigneesToAssignableInput!): AddAssigneesToAssignablePayload + addAssigneesToAssignable(input: AddAssigneesToAssignableInput!): AddAssigneesToAssignablePayload - addComment(input: AddCommentInput!): AddCommentPayload + addComment(input: AddCommentInput!): AddCommentPayload - addLabelsToLabelable(input: AddLabelsToLabelableInput!): AddLabelsToLabelablePayload + addLabelsToLabelable(input: AddLabelsToLabelableInput!): AddLabelsToLabelablePayload - addProjectCard(input: AddProjectCardInput!): AddProjectCardPayload + addProjectCard(input: AddProjectCardInput!): AddProjectCardPayload - addProjectColumn(input: AddProjectColumnInput!): AddProjectColumnPayload + addProjectColumn(input: AddProjectColumnInput!): AddProjectColumnPayload - addPullRequestReview(input: AddPullRequestReviewInput!): AddPullRequestReviewPayload + addPullRequestReview(input: AddPullRequestReviewInput!): AddPullRequestReviewPayload - addPullRequestReviewComment(input: AddPullRequestReviewCommentInput!): AddPullRequestReviewCommentPayload + addPullRequestReviewComment(input: AddPullRequestReviewCommentInput!): AddPullRequestReviewCommentPayload - addReaction(input: AddReactionInput!): AddReactionPayload + addReaction(input: AddReactionInput!): AddReactionPayload - addStar(input: AddStarInput!): AddStarPayload + addStar(input: AddStarInput!): AddStarPayload - changeUserStatus(input: ChangeUserStatusInput!): ChangeUserStatusPayload + changeUserStatus(input: ChangeUserStatusInput!): ChangeUserStatusPayload - clearLabelsFromLabelable(input: ClearLabelsFromLabelableInput!): ClearLabelsFromLabelablePayload + clearLabelsFromLabelable(input: ClearLabelsFromLabelableInput!): ClearLabelsFromLabelablePayload - cloneProject(input: CloneProjectInput!): CloneProjectPayload + cloneProject(input: CloneProjectInput!): CloneProjectPayload - cloneTemplateRepository(input: CloneTemplateRepositoryInput!): CloneTemplateRepositoryPayload + cloneTemplateRepository(input: CloneTemplateRepositoryInput!): CloneTemplateRepositoryPayload - closeIssue(input: CloseIssueInput!): CloseIssuePayload + closeIssue(input: CloseIssueInput!): CloseIssuePayload - closePullRequest(input: ClosePullRequestInput!): ClosePullRequestPayload + closePullRequest(input: ClosePullRequestInput!): ClosePullRequestPayload - convertProjectCardNoteToIssue(input: ConvertProjectCardNoteToIssueInput!): ConvertProjectCardNoteToIssuePayload + convertProjectCardNoteToIssue(input: ConvertProjectCardNoteToIssueInput!): ConvertProjectCardNoteToIssuePayload - createBranchProtectionRule(input: CreateBranchProtectionRuleInput!): CreateBranchProtectionRulePayload + createBranchProtectionRule(input: CreateBranchProtectionRuleInput!): CreateBranchProtectionRulePayload - createIssue(input: CreateIssueInput!): CreateIssuePayload + createIssue(input: CreateIssueInput!): CreateIssuePayload - createProject(input: CreateProjectInput!): CreateProjectPayload + createProject(input: CreateProjectInput!): CreateProjectPayload - createPullRequest(input: CreatePullRequestInput!): CreatePullRequestPayload + createPullRequest(input: CreatePullRequestInput!): CreatePullRequestPayload - createRef(input: CreateRefInput!): CreateRefPayload + createRef(input: CreateRefInput!): CreateRefPayload - createRepository(input: CreateRepositoryInput!): CreateRepositoryPayload + createRepository(input: CreateRepositoryInput!): CreateRepositoryPayload - declineTopicSuggestion(input: DeclineTopicSuggestionInput!): DeclineTopicSuggestionPayload + declineTopicSuggestion(input: DeclineTopicSuggestionInput!): DeclineTopicSuggestionPayload - deleteBranchProtectionRule(input: DeleteBranchProtectionRuleInput!): DeleteBranchProtectionRulePayload + deleteBranchProtectionRule(input: DeleteBranchProtectionRuleInput!): DeleteBranchProtectionRulePayload - deleteIssue(input: DeleteIssueInput!): DeleteIssuePayload + deleteIssue(input: DeleteIssueInput!): DeleteIssuePayload - deleteIssueComment(input: DeleteIssueCommentInput!): DeleteIssueCommentPayload + deleteIssueComment(input: DeleteIssueCommentInput!): DeleteIssueCommentPayload - deleteProject(input: DeleteProjectInput!): DeleteProjectPayload + deleteProject(input: DeleteProjectInput!): DeleteProjectPayload - deleteProjectCard(input: DeleteProjectCardInput!): DeleteProjectCardPayload + deleteProjectCard(input: DeleteProjectCardInput!): DeleteProjectCardPayload - deleteProjectColumn(input: DeleteProjectColumnInput!): DeleteProjectColumnPayload + deleteProjectColumn(input: DeleteProjectColumnInput!): DeleteProjectColumnPayload - deletePullRequestReview(input: DeletePullRequestReviewInput!): DeletePullRequestReviewPayload + deletePullRequestReview(input: DeletePullRequestReviewInput!): DeletePullRequestReviewPayload - deletePullRequestReviewComment(input: DeletePullRequestReviewCommentInput!): DeletePullRequestReviewCommentPayload + deletePullRequestReviewComment(input: DeletePullRequestReviewCommentInput!): DeletePullRequestReviewCommentPayload - deleteRef(input: DeleteRefInput!): DeleteRefPayload + deleteRef(input: DeleteRefInput!): DeleteRefPayload - dismissPullRequestReview(input: DismissPullRequestReviewInput!): DismissPullRequestReviewPayload + dismissPullRequestReview(input: DismissPullRequestReviewInput!): DismissPullRequestReviewPayload - linkRepositoryToProject(input: LinkRepositoryToProjectInput!): LinkRepositoryToProjectPayload + linkRepositoryToProject(input: LinkRepositoryToProjectInput!): LinkRepositoryToProjectPayload - lockLockable(input: LockLockableInput!): LockLockablePayload + lockLockable(input: LockLockableInput!): LockLockablePayload - mergeBranch(input: MergeBranchInput!): MergeBranchPayload + mergeBranch(input: MergeBranchInput!): MergeBranchPayload - mergePullRequest(input: MergePullRequestInput!): MergePullRequestPayload + mergePullRequest(input: MergePullRequestInput!): MergePullRequestPayload - moveProjectCard(input: MoveProjectCardInput!): MoveProjectCardPayload + moveProjectCard(input: MoveProjectCardInput!): MoveProjectCardPayload - moveProjectColumn(input: MoveProjectColumnInput!): MoveProjectColumnPayload + moveProjectColumn(input: MoveProjectColumnInput!): MoveProjectColumnPayload - removeAssigneesFromAssignable(input: RemoveAssigneesFromAssignableInput!): RemoveAssigneesFromAssignablePayload + removeAssigneesFromAssignable(input: RemoveAssigneesFromAssignableInput!): RemoveAssigneesFromAssignablePayload - removeLabelsFromLabelable(input: RemoveLabelsFromLabelableInput!): RemoveLabelsFromLabelablePayload + removeLabelsFromLabelable(input: RemoveLabelsFromLabelableInput!): RemoveLabelsFromLabelablePayload - removeOutsideCollaborator(input: RemoveOutsideCollaboratorInput!): RemoveOutsideCollaboratorPayload + removeOutsideCollaborator(input: RemoveOutsideCollaboratorInput!): RemoveOutsideCollaboratorPayload - removeReaction(input: RemoveReactionInput!): RemoveReactionPayload + removeReaction(input: RemoveReactionInput!): RemoveReactionPayload - removeStar(input: RemoveStarInput!): RemoveStarPayload + removeStar(input: RemoveStarInput!): RemoveStarPayload - reopenIssue(input: ReopenIssueInput!): ReopenIssuePayload + reopenIssue(input: ReopenIssueInput!): ReopenIssuePayload - reopenPullRequest(input: ReopenPullRequestInput!): ReopenPullRequestPayload + reopenPullRequest(input: ReopenPullRequestInput!): ReopenPullRequestPayload - requestReviews(input: RequestReviewsInput!): RequestReviewsPayload + requestReviews(input: RequestReviewsInput!): RequestReviewsPayload - resolveReviewThread(input: ResolveReviewThreadInput!): ResolveReviewThreadPayload + resolveReviewThread(input: ResolveReviewThreadInput!): ResolveReviewThreadPayload - submitPullRequestReview(input: SubmitPullRequestReviewInput!): SubmitPullRequestReviewPayload + submitPullRequestReview(input: SubmitPullRequestReviewInput!): SubmitPullRequestReviewPayload - unlinkRepositoryFromProject(input: UnlinkRepositoryFromProjectInput!): UnlinkRepositoryFromProjectPayload + unlinkRepositoryFromProject(input: UnlinkRepositoryFromProjectInput!): UnlinkRepositoryFromProjectPayload - unlockLockable(input: UnlockLockableInput!): UnlockLockablePayload + unlockLockable(input: UnlockLockableInput!): UnlockLockablePayload - unmarkIssueAsDuplicate(input: UnmarkIssueAsDuplicateInput!): UnmarkIssueAsDuplicatePayload + unmarkIssueAsDuplicate(input: UnmarkIssueAsDuplicateInput!): UnmarkIssueAsDuplicatePayload - unresolveReviewThread(input: UnresolveReviewThreadInput!): UnresolveReviewThreadPayload + unresolveReviewThread(input: UnresolveReviewThreadInput!): UnresolveReviewThreadPayload - updateBranchProtectionRule(input: UpdateBranchProtectionRuleInput!): UpdateBranchProtectionRulePayload + updateBranchProtectionRule(input: UpdateBranchProtectionRuleInput!): UpdateBranchProtectionRulePayload - updateIssue(input: UpdateIssueInput!): UpdateIssuePayload + updateIssue(input: UpdateIssueInput!): UpdateIssuePayload - updateIssueComment(input: UpdateIssueCommentInput!): UpdateIssueCommentPayload + updateIssueComment(input: UpdateIssueCommentInput!): UpdateIssueCommentPayload - updateProject(input: UpdateProjectInput!): UpdateProjectPayload + updateProject(input: UpdateProjectInput!): UpdateProjectPayload - updateProjectCard(input: UpdateProjectCardInput!): UpdateProjectCardPayload + updateProjectCard(input: UpdateProjectCardInput!): UpdateProjectCardPayload - updateProjectColumn(input: UpdateProjectColumnInput!): UpdateProjectColumnPayload + updateProjectColumn(input: UpdateProjectColumnInput!): UpdateProjectColumnPayload - updatePullRequest(input: UpdatePullRequestInput!): UpdatePullRequestPayload + updatePullRequest(input: UpdatePullRequestInput!): UpdatePullRequestPayload - updatePullRequestReview(input: UpdatePullRequestReviewInput!): UpdatePullRequestReviewPayload + updatePullRequestReview(input: UpdatePullRequestReviewInput!): UpdatePullRequestReviewPayload - updatePullRequestReviewComment(input: UpdatePullRequestReviewCommentInput!): UpdatePullRequestReviewCommentPayload + updatePullRequestReviewComment(input: UpdatePullRequestReviewCommentInput!): UpdatePullRequestReviewCommentPayload - updateRef(input: UpdateRefInput!): UpdateRefPayload + updateRef(input: UpdateRefInput!): UpdateRefPayload - updateRepository(input: UpdateRepositoryInput!): UpdateRepositoryPayload + updateRepository(input: UpdateRepositoryInput!): UpdateRepositoryPayload - updateSubscription(input: UpdateSubscriptionInput!): UpdateSubscriptionPayload + updateSubscription(input: UpdateSubscriptionInput!): UpdateSubscriptionPayload - updateTopics(input: UpdateTopicsInput!): UpdateTopicsPayload + updateTopics(input: UpdateTopicsInput!): UpdateTopicsPayload } interface Node { - id: ID! + id: ID! } enum OrderDirection { - ASC + ASC - DESC + DESC } type Organization implements Actor & MemberStatusable & Node & ProfileOwner & ProjectOwner & RegistryPackageOwner & RegistryPackageSearch & RepositoryOwner & UniformResourceLocatable { - anyPinnableItems( - type: PinnableItemType - ): Boolean! + anyPinnableItems( + type: PinnableItemType + ): Boolean! - avatarUrl( - size: Int - ): URI! + avatarUrl( + size: Int + ): URI! - databaseId: Int + databaseId: Int - description: String + description: String - email: String - id: ID! + email: String + id: ID! - isVerified: Boolean! + isVerified: Boolean! - itemShowcase: ProfileItemShowcase! + itemShowcase: ProfileItemShowcase! - location: String + location: String - login: String! + login: String! - memberStatuses( - after: String + memberStatuses( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: UserStatusOrder = {field: UPDATED_AT, direction: DESC} - ): UserStatusConnection! + orderBy: UserStatusOrder = {field: UPDATED_AT, direction: DESC} + ): UserStatusConnection! - membersWithRole( - after: String + membersWithRole( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): OrganizationMemberConnection! + last: Int + ): OrganizationMemberConnection! - name: String + name: String - newTeamResourcePath: URI! + newTeamResourcePath: URI! - newTeamUrl: URI! + newTeamUrl: URI! - organizationBillingEmail: String + organizationBillingEmail: String - pendingMembers( - after: String + pendingMembers( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): UserConnection! + last: Int + ): UserConnection! - pinnableItems( - after: String + pinnableItems( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - types: [PinnableItemType!] - ): PinnableItemConnection! + types: [PinnableItemType!] + ): PinnableItemConnection! - pinnedItems( - after: String + pinnedItems( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - types: [PinnableItemType!] - ): PinnableItemConnection! + types: [PinnableItemType!] + ): PinnableItemConnection! - pinnedItemsRemaining: Int! + pinnedItemsRemaining: Int! - pinnedRepositories( - affiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] + pinnedRepositories( + affiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] - after: String + after: String - before: String + before: String - first: Int + first: Int - isLocked: Boolean + isLocked: Boolean - last: Int + last: Int - orderBy: RepositoryOrder + orderBy: RepositoryOrder - ownerAffiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] + ownerAffiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] - privacy: RepositoryPrivacy - ): RepositoryConnection! @deprecated(reason: "pinnedRepositories will be removed Use ProfileOwner.pinnedItems instead. Removal on 2019-10-01 UTC.") + privacy: RepositoryPrivacy + ): RepositoryConnection! @deprecated(reason: "pinnedRepositories will be removed Use ProfileOwner.pinnedItems instead. Removal on 2019-10-01 UTC.") - project( - number: Int! - ): Project + project( + number: Int! + ): Project - projects( - after: String + projects( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: ProjectOrder + orderBy: ProjectOrder - search: String + search: String - states: [ProjectState!] - ): ProjectConnection! + states: [ProjectState!] + ): ProjectConnection! - projectsResourcePath: URI! + projectsResourcePath: URI! - projectsUrl: URI! + projectsUrl: URI! - registryPackages( - after: String + registryPackages( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - name: String + name: String - names: [String] + names: [String] - packageType: RegistryPackageType + packageType: RegistryPackageType - publicOnly: Boolean = false + publicOnly: Boolean = false - registryPackageType: String + registryPackageType: String - repositoryId: ID - ): RegistryPackageConnection! + repositoryId: ID + ): RegistryPackageConnection! - registryPackagesForQuery( - after: String + registryPackagesForQuery( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - packageType: RegistryPackageType + packageType: RegistryPackageType - query: String - ): RegistryPackageConnection! + query: String + ): RegistryPackageConnection! - repositories( - affiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] + repositories( + affiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] - after: String + after: String - before: String + before: String - first: Int + first: Int - isFork: Boolean + isFork: Boolean - isLocked: Boolean + isLocked: Boolean - last: Int + last: Int - orderBy: RepositoryOrder + orderBy: RepositoryOrder - ownerAffiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] + ownerAffiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] - privacy: RepositoryPrivacy - ): RepositoryConnection! + privacy: RepositoryPrivacy + ): RepositoryConnection! - repository( - name: String! - ): Repository + repository( + name: String! + ): Repository - requiresTwoFactorAuthentication: Boolean + requiresTwoFactorAuthentication: Boolean - resourcePath: URI! + resourcePath: URI! - samlIdentityProvider: OrganizationIdentityProvider + samlIdentityProvider: OrganizationIdentityProvider - team( - slug: String! - ): Team + team( + slug: String! + ): Team - teams( - after: String + teams( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - ldapMapped: Boolean + ldapMapped: Boolean - orderBy: TeamOrder + orderBy: TeamOrder - privacy: TeamPrivacy + privacy: TeamPrivacy - query: String + query: String - role: TeamRole + role: TeamRole - rootTeamsOnly: Boolean = false + rootTeamsOnly: Boolean = false - userLogins: [String!] - ): TeamConnection! + userLogins: [String!] + ): TeamConnection! - teamsResourcePath: URI! + teamsResourcePath: URI! - teamsUrl: URI! + teamsUrl: URI! - url: URI! + url: URI! - viewerCanAdminister: Boolean! + viewerCanAdminister: Boolean! - viewerCanChangePinnedItems: Boolean! + viewerCanChangePinnedItems: Boolean! - viewerCanCreateProjects: Boolean! + viewerCanCreateProjects: Boolean! - viewerCanCreateRepositories: Boolean! + viewerCanCreateRepositories: Boolean! - viewerCanCreateTeams: Boolean! + viewerCanCreateTeams: Boolean! - viewerIsAMember: Boolean! + viewerIsAMember: Boolean! - websiteUrl: URI + websiteUrl: URI } type OrganizationConnection { - edges: [OrganizationEdge] + edges: [OrganizationEdge] - nodes: [Organization] + nodes: [Organization] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type OrganizationEdge { - cursor: String! + cursor: String! - node: Organization + node: Organization } type OrganizationIdentityProvider implements Node { - digestMethod: URI + digestMethod: URI - externalIdentities( - after: String + externalIdentities( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): ExternalIdentityConnection! - id: ID! + last: Int + ): ExternalIdentityConnection! + id: ID! - idpCertificate: X509Certificate + idpCertificate: X509Certificate - issuer: String + issuer: String - organization: Organization + organization: Organization - signatureMethod: URI + signatureMethod: URI - ssoUrl: URI + ssoUrl: URI } type OrganizationInvitation implements Node { - createdAt: DateTime! + createdAt: DateTime! - email: String - id: ID! + email: String + id: ID! - invitationType: OrganizationInvitationType! + invitationType: OrganizationInvitationType! - invitee: User + invitee: User - inviter: User! + inviter: User! - organization: Organization! + organization: Organization! - role: OrganizationInvitationRole! + role: OrganizationInvitationRole! } type OrganizationInvitationConnection { - edges: [OrganizationInvitationEdge] + edges: [OrganizationInvitationEdge] - nodes: [OrganizationInvitation] + nodes: [OrganizationInvitation] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type OrganizationInvitationEdge { - cursor: String! + cursor: String! - node: OrganizationInvitation + node: OrganizationInvitation } enum OrganizationInvitationRole { - ADMIN + ADMIN - BILLING_MANAGER + BILLING_MANAGER - DIRECT_MEMBER + DIRECT_MEMBER - REINSTATE + REINSTATE } enum OrganizationInvitationType { - EMAIL + EMAIL - USER + USER } type OrganizationMemberConnection { - edges: [OrganizationMemberEdge] + edges: [OrganizationMemberEdge] - nodes: [User] + nodes: [User] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type OrganizationMemberEdge { - cursor: String! + cursor: String! - hasTwoFactorEnabled: Boolean + hasTwoFactorEnabled: Boolean - node: User + node: User - role: OrganizationMemberRole + role: OrganizationMemberRole } enum OrganizationMemberRole { - ADMIN + ADMIN - MEMBER + MEMBER } type PageInfo { - endCursor: String + endCursor: String - hasNextPage: Boolean! + hasNextPage: Boolean! - hasPreviousPage: Boolean! + hasPreviousPage: Boolean! - startCursor: String + startCursor: String } union PermissionGranter = Organization | Repository | Team type PermissionSource { - organization: Organization! + organization: Organization! - permission: DefaultRepositoryPermissionField! + permission: DefaultRepositoryPermissionField! - source: PermissionGranter! + source: PermissionGranter! } input PinIssueInput { - clientMutationId: String + clientMutationId: String - issueId: ID! + issueId: ID! } union PinnableItem = Gist | Repository type PinnableItemConnection { - edges: [PinnableItemEdge] + edges: [PinnableItemEdge] - nodes: [PinnableItem] + nodes: [PinnableItem] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type PinnableItemEdge { - cursor: String! + cursor: String! - node: PinnableItem + node: PinnableItem } enum PinnableItemType { - GIST + GIST - ISSUE + ISSUE - ORGANIZATION + ORGANIZATION - PROJECT + PROJECT - PULL_REQUEST + PULL_REQUEST - REPOSITORY + REPOSITORY - TEAM + TEAM - USER + USER } type PinnedEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - issue: Issue! + issue: Issue! } type ProfileItemShowcase { - hasPinnedItems: Boolean! + hasPinnedItems: Boolean! - items( - after: String + items( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): PinnableItemConnection! + last: Int + ): PinnableItemConnection! } interface ProfileOwner { - anyPinnableItems( - type: PinnableItemType - ): Boolean! + anyPinnableItems( + type: PinnableItemType + ): Boolean! - email: String - id: ID! + email: String + id: ID! - itemShowcase: ProfileItemShowcase! + itemShowcase: ProfileItemShowcase! - location: String + location: String - login: String! + login: String! - name: String + name: String - pinnableItems( - after: String + pinnableItems( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - types: [PinnableItemType!] - ): PinnableItemConnection! + types: [PinnableItemType!] + ): PinnableItemConnection! - pinnedItems( - after: String + pinnedItems( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - types: [PinnableItemType!] - ): PinnableItemConnection! + types: [PinnableItemType!] + ): PinnableItemConnection! - pinnedItemsRemaining: Int! + pinnedItemsRemaining: Int! - viewerCanChangePinnedItems: Boolean! + viewerCanChangePinnedItems: Boolean! - websiteUrl: URI + websiteUrl: URI } type Project implements Closable & Node & Updatable { - body: String + body: String - bodyHTML: HTML! + bodyHTML: HTML! - closed: Boolean! + closed: Boolean! - closedAt: DateTime + closedAt: DateTime - columns( - after: String + columns( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): ProjectColumnConnection! + last: Int + ): ProjectColumnConnection! - createdAt: DateTime! + createdAt: DateTime! - creator: Actor + creator: Actor - databaseId: Int - id: ID! + databaseId: Int + id: ID! - name: String! + name: String! - number: Int! + number: Int! - owner: ProjectOwner! + owner: ProjectOwner! - pendingCards( - after: String + pendingCards( + after: String - archivedStates: [ProjectCardArchivedState] = [ARCHIVED, NOT_ARCHIVED] + archivedStates: [ProjectCardArchivedState] = [ARCHIVED, NOT_ARCHIVED] - before: String + before: String - first: Int + first: Int - last: Int - ): ProjectCardConnection! + last: Int + ): ProjectCardConnection! - resourcePath: URI! + resourcePath: URI! - state: ProjectState! + state: ProjectState! - updatedAt: DateTime! + updatedAt: DateTime! - url: URI! + url: URI! - viewerCanUpdate: Boolean! + viewerCanUpdate: Boolean! } type ProjectCard implements Node { - column: ProjectColumn + column: ProjectColumn - content: ProjectCardItem + content: ProjectCardItem - createdAt: DateTime! + createdAt: DateTime! - creator: Actor + creator: Actor - databaseId: Int - id: ID! + databaseId: Int + id: ID! - isArchived: Boolean! + isArchived: Boolean! - note: String + note: String - project: Project! + project: Project! - resourcePath: URI! + resourcePath: URI! - state: ProjectCardState + state: ProjectCardState - updatedAt: DateTime! + updatedAt: DateTime! - url: URI! + url: URI! } enum ProjectCardArchivedState { - ARCHIVED + ARCHIVED - NOT_ARCHIVED + NOT_ARCHIVED } type ProjectCardConnection { - edges: [ProjectCardEdge] + edges: [ProjectCardEdge] - nodes: [ProjectCard] + nodes: [ProjectCard] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type ProjectCardEdge { - cursor: String! + cursor: String! - node: ProjectCard + node: ProjectCard } input ProjectCardImport { - number: Int! + number: Int! - repository: String! + repository: String! } union ProjectCardItem = Issue | PullRequest enum ProjectCardState { - CONTENT_ONLY + CONTENT_ONLY - NOTE_ONLY + NOTE_ONLY - REDACTED + REDACTED } type ProjectColumn implements Node { - cards( - after: String + cards( + after: String - archivedStates: [ProjectCardArchivedState] = [ARCHIVED, NOT_ARCHIVED] + archivedStates: [ProjectCardArchivedState] = [ARCHIVED, NOT_ARCHIVED] - before: String + before: String - first: Int + first: Int - last: Int - ): ProjectCardConnection! + last: Int + ): ProjectCardConnection! - createdAt: DateTime! + createdAt: DateTime! - databaseId: Int - id: ID! + databaseId: Int + id: ID! - name: String! + name: String! - project: Project! + project: Project! - purpose: ProjectColumnPurpose + purpose: ProjectColumnPurpose - resourcePath: URI! + resourcePath: URI! - updatedAt: DateTime! + updatedAt: DateTime! - url: URI! + url: URI! } type ProjectColumnConnection { - edges: [ProjectColumnEdge] + edges: [ProjectColumnEdge] - nodes: [ProjectColumn] + nodes: [ProjectColumn] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type ProjectColumnEdge { - cursor: String! + cursor: String! - node: ProjectColumn + node: ProjectColumn } input ProjectColumnImport { - columnName: String! + columnName: String! - issues: [ProjectCardImport!] + issues: [ProjectCardImport!] - position: Int! + position: Int! } enum ProjectColumnPurpose { - DONE + DONE - IN_PROGRESS + IN_PROGRESS - TODO + TODO } type ProjectConnection { - edges: [ProjectEdge] + edges: [ProjectEdge] - nodes: [Project] + nodes: [Project] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type ProjectEdge { - cursor: String! + cursor: String! - node: Project + node: Project } input ProjectOrder { - direction: OrderDirection! + direction: OrderDirection! - field: ProjectOrderField! + field: ProjectOrderField! } enum ProjectOrderField { - CREATED_AT + CREATED_AT - NAME + NAME - UPDATED_AT + UPDATED_AT } interface ProjectOwner { - id: ID! + id: ID! - project( - number: Int! - ): Project + project( + number: Int! + ): Project - projects( - after: String + projects( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: ProjectOrder + orderBy: ProjectOrder - search: String + search: String - states: [ProjectState!] - ): ProjectConnection! + states: [ProjectState!] + ): ProjectConnection! - projectsResourcePath: URI! + projectsResourcePath: URI! - projectsUrl: URI! + projectsUrl: URI! - viewerCanCreateProjects: Boolean! + viewerCanCreateProjects: Boolean! } enum ProjectState { - CLOSED + CLOSED - OPEN + OPEN } enum ProjectTemplate { - AUTOMATED_KANBAN_V2 + AUTOMATED_KANBAN_V2 - AUTOMATED_REVIEWS_KANBAN + AUTOMATED_REVIEWS_KANBAN - BASIC_KANBAN + BASIC_KANBAN - BUG_TRIAGE + BUG_TRIAGE } type PublicKey implements Node { - accessedAt: DateTime + accessedAt: DateTime - createdAt: DateTime + createdAt: DateTime - fingerprint: String! - id: ID! + fingerprint: String! + id: ID! - isReadOnly: Boolean + isReadOnly: Boolean - key: String! + key: String! - updatedAt: DateTime + updatedAt: DateTime } type PublicKeyConnection { - edges: [PublicKeyEdge] + edges: [PublicKeyEdge] - nodes: [PublicKey] + nodes: [PublicKey] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type PublicKeyEdge { - cursor: String! + cursor: String! - node: PublicKey + node: PublicKey } type PullRequest implements Assignable & Closable & Comment & Labelable & Lockable & Node & Reactable & RepositoryNode & Subscribable & UniformResourceLocatable & Updatable & UpdatableComment { - activeLockReason: LockReason + activeLockReason: LockReason - additions: Int! + additions: Int! - assignees( - after: String + assignees( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): UserConnection! + last: Int + ): UserConnection! - author: Actor + author: Actor - authorAssociation: CommentAuthorAssociation! + authorAssociation: CommentAuthorAssociation! - baseRef: Ref + baseRef: Ref - baseRefName: String! + baseRefName: String! - baseRefOid: GitObjectID! + baseRefOid: GitObjectID! - baseRepository: Repository + baseRepository: Repository - body: String! + body: String! - bodyHTML: HTML! + bodyHTML: HTML! - bodyText: String! + bodyText: String! - changedFiles: Int! + changedFiles: Int! - closed: Boolean! + closed: Boolean! - closedAt: DateTime + closedAt: DateTime - comments( - after: String + comments( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): IssueCommentConnection! + last: Int + ): IssueCommentConnection! - commits( - after: String + commits( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): PullRequestCommitConnection! + last: Int + ): PullRequestCommitConnection! - createdAt: DateTime! + createdAt: DateTime! - createdViaEmail: Boolean! + createdViaEmail: Boolean! - databaseId: Int + databaseId: Int - deletions: Int! + deletions: Int! - editor: Actor + editor: Actor - files( - after: String + files( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): PullRequestChangedFileConnection + last: Int + ): PullRequestChangedFileConnection - headRef: Ref + headRef: Ref - headRefName: String! + headRefName: String! - headRefOid: GitObjectID! + headRefOid: GitObjectID! - headRepository: Repository + headRepository: Repository - headRepositoryOwner: RepositoryOwner - id: ID! + headRepositoryOwner: RepositoryOwner + id: ID! - includesCreatedEdit: Boolean! + includesCreatedEdit: Boolean! - isCrossRepository: Boolean! + isCrossRepository: Boolean! - labels( - after: String + labels( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): LabelConnection + last: Int + ): LabelConnection - lastEditedAt: DateTime + lastEditedAt: DateTime - locked: Boolean! + locked: Boolean! - maintainerCanModify: Boolean! + maintainerCanModify: Boolean! - mergeCommit: Commit + mergeCommit: Commit - mergeable: MergeableState! + mergeable: MergeableState! - merged: Boolean! + merged: Boolean! - mergedAt: DateTime + mergedAt: DateTime - mergedBy: Actor + mergedBy: Actor - milestone: Milestone + milestone: Milestone - number: Int! + number: Int! - participants( - after: String + participants( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): UserConnection! + last: Int + ): UserConnection! - permalink: URI! + permalink: URI! - potentialMergeCommit: Commit + potentialMergeCommit: Commit - projectCards( - after: String + projectCards( + after: String - archivedStates: [ProjectCardArchivedState] = [ARCHIVED, NOT_ARCHIVED] + archivedStates: [ProjectCardArchivedState] = [ARCHIVED, NOT_ARCHIVED] - before: String + before: String - first: Int + first: Int - last: Int - ): ProjectCardConnection! + last: Int + ): ProjectCardConnection! - publishedAt: DateTime + publishedAt: DateTime - reactionGroups: [ReactionGroup!] + reactionGroups: [ReactionGroup!] - reactions( - after: String + reactions( + after: String - before: String + before: String - content: ReactionContent + content: ReactionContent - first: Int + first: Int - last: Int + last: Int - orderBy: ReactionOrder - ): ReactionConnection! + orderBy: ReactionOrder + ): ReactionConnection! - repository: Repository! + repository: Repository! - resourcePath: URI! + resourcePath: URI! - revertResourcePath: URI! + revertResourcePath: URI! - revertUrl: URI! + revertUrl: URI! - reviewRequests( - after: String + reviewRequests( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): ReviewRequestConnection + last: Int + ): ReviewRequestConnection - reviewThreads( - after: String + reviewThreads( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): PullRequestReviewThreadConnection! + last: Int + ): PullRequestReviewThreadConnection! - reviews( - after: String + reviews( + after: String - author: String + author: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - states: [PullRequestReviewState!] - ): PullRequestReviewConnection + states: [PullRequestReviewState!] + ): PullRequestReviewConnection - state: PullRequestState! + state: PullRequestState! - suggestedReviewers: [SuggestedReviewer]! + suggestedReviewers: [SuggestedReviewer]! - timeline( - after: String + timeline( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - since: DateTime - ): PullRequestTimelineConnection! @deprecated(reason: "`timeline` will be removed Use PullRequest.timelineItems instead. Removal on 2019-10-01 UTC.") + since: DateTime + ): PullRequestTimelineConnection! @deprecated(reason: "`timeline` will be removed Use PullRequest.timelineItems instead. Removal on 2019-10-01 UTC.") - timelineItems( - after: String + timelineItems( + after: String - before: String + before: String - first: Int + first: Int - itemTypes: [PullRequestTimelineItemsItemType!] + itemTypes: [PullRequestTimelineItemsItemType!] - last: Int + last: Int - since: DateTime + since: DateTime - skip: Int - ): PullRequestTimelineItemsConnection! + skip: Int + ): PullRequestTimelineItemsConnection! - title: String! + title: String! - updatedAt: DateTime! + updatedAt: DateTime! - url: URI! + url: URI! - userContentEdits( - after: String + userContentEdits( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): UserContentEditConnection + last: Int + ): UserContentEditConnection - viewerCanApplySuggestion: Boolean! + viewerCanApplySuggestion: Boolean! - viewerCanReact: Boolean! + viewerCanReact: Boolean! - viewerCanSubscribe: Boolean! + viewerCanSubscribe: Boolean! - viewerCanUpdate: Boolean! + viewerCanUpdate: Boolean! - viewerCannotUpdateReasons: [CommentCannotUpdateReason!]! + viewerCannotUpdateReasons: [CommentCannotUpdateReason!]! - viewerDidAuthor: Boolean! + viewerDidAuthor: Boolean! - viewerSubscription: SubscriptionState + viewerSubscription: SubscriptionState } type PullRequestChangedFile { - additions: Int! + additions: Int! - deletions: Int! + deletions: Int! - path: String! + path: String! } type PullRequestChangedFileConnection { - edges: [PullRequestChangedFileEdge] + edges: [PullRequestChangedFileEdge] - nodes: [PullRequestChangedFile] + nodes: [PullRequestChangedFile] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type PullRequestChangedFileEdge { - cursor: String! + cursor: String! - node: PullRequestChangedFile + node: PullRequestChangedFile } type PullRequestCommit implements Node & UniformResourceLocatable { - commit: Commit! - id: ID! + commit: Commit! + id: ID! - pullRequest: PullRequest! + pullRequest: PullRequest! - resourcePath: URI! + resourcePath: URI! - url: URI! + url: URI! } type PullRequestCommitCommentThread implements Node & RepositoryNode { - comments( - after: String + comments( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): CommitCommentConnection! + last: Int + ): CommitCommentConnection! - commit: Commit! - id: ID! + commit: Commit! + id: ID! - path: String + path: String - position: Int + position: Int - pullRequest: PullRequest! + pullRequest: PullRequest! - repository: Repository! + repository: Repository! } type PullRequestCommitConnection { - edges: [PullRequestCommitEdge] + edges: [PullRequestCommitEdge] - nodes: [PullRequestCommit] + nodes: [PullRequestCommit] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type PullRequestCommitEdge { - cursor: String! + cursor: String! - node: PullRequestCommit + node: PullRequestCommit } type PullRequestConnection { - edges: [PullRequestEdge] + edges: [PullRequestEdge] - nodes: [PullRequest] + nodes: [PullRequest] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type PullRequestContributionsByRepository { - contributions( - after: String + contributions( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: ContributionOrder = {field: OCCURRED_AT, direction: DESC} - ): CreatedPullRequestContributionConnection! + orderBy: ContributionOrder = {field: OCCURRED_AT, direction: DESC} + ): CreatedPullRequestContributionConnection! - repository: Repository! + repository: Repository! } type PullRequestEdge { - cursor: String! + cursor: String! - node: PullRequest + node: PullRequest } input PullRequestOrder { - direction: OrderDirection! + direction: OrderDirection! - field: PullRequestOrderField! + field: PullRequestOrderField! } enum PullRequestOrderField { - CREATED_AT + CREATED_AT - UPDATED_AT + UPDATED_AT } enum PullRequestPubSubTopic { - HEAD_REF + HEAD_REF - MARKASREAD + MARKASREAD - STATE + STATE - TIMELINE + TIMELINE - UPDATED + UPDATED } type PullRequestReview implements Comment & Deletable & Node & Reactable & RepositoryNode & Updatable & UpdatableComment { - author: Actor + author: Actor - authorAssociation: CommentAuthorAssociation! + authorAssociation: CommentAuthorAssociation! - body: String! + body: String! - bodyHTML: HTML! + bodyHTML: HTML! - bodyText: String! + bodyText: String! - comments( - after: String + comments( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): PullRequestReviewCommentConnection! + last: Int + ): PullRequestReviewCommentConnection! - commit: Commit + commit: Commit - createdAt: DateTime! + createdAt: DateTime! - createdViaEmail: Boolean! + createdViaEmail: Boolean! - databaseId: Int + databaseId: Int - editor: Actor - id: ID! + editor: Actor + id: ID! - includesCreatedEdit: Boolean! + includesCreatedEdit: Boolean! - lastEditedAt: DateTime + lastEditedAt: DateTime - onBehalfOf( - after: String + onBehalfOf( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): TeamConnection! + last: Int + ): TeamConnection! - publishedAt: DateTime + publishedAt: DateTime - pullRequest: PullRequest! + pullRequest: PullRequest! - reactionGroups: [ReactionGroup!] + reactionGroups: [ReactionGroup!] - reactions( - after: String + reactions( + after: String - before: String + before: String - content: ReactionContent + content: ReactionContent - first: Int + first: Int - last: Int + last: Int - orderBy: ReactionOrder - ): ReactionConnection! + orderBy: ReactionOrder + ): ReactionConnection! - repository: Repository! + repository: Repository! - resourcePath: URI! + resourcePath: URI! - state: PullRequestReviewState! + state: PullRequestReviewState! - submittedAt: DateTime + submittedAt: DateTime - updatedAt: DateTime! + updatedAt: DateTime! - url: URI! + url: URI! - userContentEdits( - after: String + userContentEdits( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): UserContentEditConnection + last: Int + ): UserContentEditConnection - viewerCanDelete: Boolean! + viewerCanDelete: Boolean! - viewerCanReact: Boolean! + viewerCanReact: Boolean! - viewerCanUpdate: Boolean! + viewerCanUpdate: Boolean! - viewerCannotUpdateReasons: [CommentCannotUpdateReason!]! + viewerCannotUpdateReasons: [CommentCannotUpdateReason!]! - viewerDidAuthor: Boolean! + viewerDidAuthor: Boolean! } type PullRequestReviewComment implements Comment & Deletable & Node & Reactable & RepositoryNode & Updatable & UpdatableComment { - author: Actor + author: Actor - authorAssociation: CommentAuthorAssociation! + authorAssociation: CommentAuthorAssociation! - body: String! + body: String! - bodyHTML: HTML! + bodyHTML: HTML! - bodyText: String! + bodyText: String! - commit: Commit! + commit: Commit! - createdAt: DateTime! + createdAt: DateTime! - createdViaEmail: Boolean! + createdViaEmail: Boolean! - databaseId: Int + databaseId: Int - diffHunk: String! + diffHunk: String! - draftedAt: DateTime! + draftedAt: DateTime! - editor: Actor - id: ID! + editor: Actor + id: ID! - includesCreatedEdit: Boolean! + includesCreatedEdit: Boolean! - isMinimized: Boolean! + isMinimized: Boolean! - lastEditedAt: DateTime + lastEditedAt: DateTime - minimizedReason: String + minimizedReason: String - originalCommit: Commit + originalCommit: Commit - originalPosition: Int! + originalPosition: Int! - outdated: Boolean! + outdated: Boolean! - path: String! + path: String! - position: Int + position: Int - publishedAt: DateTime + publishedAt: DateTime - pullRequest: PullRequest! + pullRequest: PullRequest! - pullRequestReview: PullRequestReview + pullRequestReview: PullRequestReview - reactionGroups: [ReactionGroup!] + reactionGroups: [ReactionGroup!] - reactions( - after: String + reactions( + after: String - before: String + before: String - content: ReactionContent + content: ReactionContent - first: Int + first: Int - last: Int + last: Int - orderBy: ReactionOrder - ): ReactionConnection! + orderBy: ReactionOrder + ): ReactionConnection! - replyTo: PullRequestReviewComment + replyTo: PullRequestReviewComment - repository: Repository! + repository: Repository! - resourcePath: URI! + resourcePath: URI! - state: PullRequestReviewCommentState! + state: PullRequestReviewCommentState! - updatedAt: DateTime! + updatedAt: DateTime! - url: URI! + url: URI! - userContentEdits( - after: String + userContentEdits( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): UserContentEditConnection + last: Int + ): UserContentEditConnection - viewerCanDelete: Boolean! + viewerCanDelete: Boolean! - viewerCanMinimize: Boolean! + viewerCanMinimize: Boolean! - viewerCanReact: Boolean! + viewerCanReact: Boolean! - viewerCanUpdate: Boolean! + viewerCanUpdate: Boolean! - viewerCannotUpdateReasons: [CommentCannotUpdateReason!]! + viewerCannotUpdateReasons: [CommentCannotUpdateReason!]! - viewerDidAuthor: Boolean! + viewerDidAuthor: Boolean! } type PullRequestReviewCommentConnection { - edges: [PullRequestReviewCommentEdge] + edges: [PullRequestReviewCommentEdge] - nodes: [PullRequestReviewComment] + nodes: [PullRequestReviewComment] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type PullRequestReviewCommentEdge { - cursor: String! + cursor: String! - node: PullRequestReviewComment + node: PullRequestReviewComment } enum PullRequestReviewCommentState { - PENDING + PENDING - SUBMITTED + SUBMITTED } type PullRequestReviewConnection { - edges: [PullRequestReviewEdge] + edges: [PullRequestReviewEdge] - nodes: [PullRequestReview] + nodes: [PullRequestReview] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type PullRequestReviewContributionsByRepository { - contributions( - after: String + contributions( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: ContributionOrder = {field: OCCURRED_AT, direction: DESC} - ): CreatedPullRequestReviewContributionConnection! + orderBy: ContributionOrder = {field: OCCURRED_AT, direction: DESC} + ): CreatedPullRequestReviewContributionConnection! - repository: Repository! + repository: Repository! } type PullRequestReviewEdge { - cursor: String! + cursor: String! - node: PullRequestReview + node: PullRequestReview } enum PullRequestReviewEvent { - APPROVE + APPROVE - COMMENT + COMMENT - DISMISS + DISMISS - REQUEST_CHANGES + REQUEST_CHANGES } enum PullRequestReviewState { - APPROVED + APPROVED - CHANGES_REQUESTED + CHANGES_REQUESTED - COMMENTED + COMMENTED - DISMISSED + DISMISSED - PENDING + PENDING } type PullRequestReviewThread implements Node { - comments( - after: String + comments( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): PullRequestReviewCommentConnection! - id: ID! + last: Int + ): PullRequestReviewCommentConnection! + id: ID! - isResolved: Boolean! + isResolved: Boolean! - pullRequest: PullRequest! + pullRequest: PullRequest! - repository: Repository! + repository: Repository! - resolvedBy: User + resolvedBy: User - viewerCanResolve: Boolean! + viewerCanResolve: Boolean! - viewerCanUnresolve: Boolean! + viewerCanUnresolve: Boolean! } type PullRequestReviewThreadConnection { - edges: [PullRequestReviewThreadEdge] + edges: [PullRequestReviewThreadEdge] - nodes: [PullRequestReviewThread] + nodes: [PullRequestReviewThread] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type PullRequestReviewThreadEdge { - cursor: String! + cursor: String! - node: PullRequestReviewThread + node: PullRequestReviewThread } type PullRequestRevisionMarker { - createdAt: DateTime! + createdAt: DateTime! - lastSeenCommit: Commit! + lastSeenCommit: Commit! - pullRequest: PullRequest! + pullRequest: PullRequest! } enum PullRequestState { - CLOSED + CLOSED - MERGED + MERGED - OPEN + OPEN } type PullRequestTimelineConnection { - edges: [PullRequestTimelineItemEdge] + edges: [PullRequestTimelineItemEdge] - nodes: [PullRequestTimelineItem] + nodes: [PullRequestTimelineItem] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } union PullRequestTimelineItem = AssignedEvent | BaseRefForcePushedEvent | ClosedEvent | Commit | CommitCommentThread | CrossReferencedEvent | DemilestonedEvent | DeployedEvent | DeploymentEnvironmentChangedEvent | HeadRefDeletedEvent | HeadRefForcePushedEvent | HeadRefRestoredEvent | IssueComment | LabeledEvent | LockedEvent | MergedEvent | MilestonedEvent | PullRequestReview | PullRequestReviewComment | PullRequestReviewThread | ReferencedEvent | RenamedTitleEvent | ReopenedEvent | ReviewDismissedEvent | ReviewRequestRemovedEvent | ReviewRequestedEvent | SubscribedEvent | UnassignedEvent | UnlabeledEvent | UnlockedEvent | UnsubscribedEvent | UserBlockedEvent type PullRequestTimelineItemEdge { - cursor: String! + cursor: String! - node: PullRequestTimelineItem + node: PullRequestTimelineItem } union PullRequestTimelineItems = AddedToProjectEvent | AssignedEvent | BaseRefChangedEvent | BaseRefForcePushedEvent | ClosedEvent | CommentDeletedEvent | ConvertedNoteToIssueEvent | CrossReferencedEvent | DemilestonedEvent | DeployedEvent | DeploymentEnvironmentChangedEvent | HeadRefDeletedEvent | HeadRefForcePushedEvent | HeadRefRestoredEvent | IssueComment | LabeledEvent | LockedEvent | MarkedAsDuplicateEvent | MentionedEvent | MergedEvent | MilestonedEvent | MovedColumnsInProjectEvent | PinnedEvent | PullRequestCommit | PullRequestCommitCommentThread | PullRequestReview | PullRequestReviewThread | PullRequestRevisionMarker | ReadyForReviewEvent | ReferencedEvent | RemovedFromProjectEvent | RenamedTitleEvent | ReopenedEvent | ReviewDismissedEvent | ReviewRequestRemovedEvent | ReviewRequestedEvent | SubscribedEvent | TransferredEvent | UnassignedEvent | UnlabeledEvent | UnlockedEvent | UnpinnedEvent | UnsubscribedEvent | UserBlockedEvent type PullRequestTimelineItemsConnection { - edges: [PullRequestTimelineItemsEdge] + edges: [PullRequestTimelineItemsEdge] - filteredCount: Int! + filteredCount: Int! - nodes: [PullRequestTimelineItems] + nodes: [PullRequestTimelineItems] - pageCount: Int! + pageCount: Int! - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! - updatedAt: DateTime! + updatedAt: DateTime! } type PullRequestTimelineItemsEdge { - cursor: String! + cursor: String! - node: PullRequestTimelineItems + node: PullRequestTimelineItems } enum PullRequestTimelineItemsItemType { - ADDED_TO_PROJECT_EVENT + ADDED_TO_PROJECT_EVENT - ASSIGNED_EVENT + ASSIGNED_EVENT - BASE_REF_CHANGED_EVENT + BASE_REF_CHANGED_EVENT - BASE_REF_FORCE_PUSHED_EVENT + BASE_REF_FORCE_PUSHED_EVENT - CLOSED_EVENT + CLOSED_EVENT - COMMENT_DELETED_EVENT + COMMENT_DELETED_EVENT - CONVERTED_NOTE_TO_ISSUE_EVENT + CONVERTED_NOTE_TO_ISSUE_EVENT - CROSS_REFERENCED_EVENT + CROSS_REFERENCED_EVENT - DEMILESTONED_EVENT + DEMILESTONED_EVENT - DEPLOYED_EVENT + DEPLOYED_EVENT - DEPLOYMENT_ENVIRONMENT_CHANGED_EVENT + DEPLOYMENT_ENVIRONMENT_CHANGED_EVENT - HEAD_REF_DELETED_EVENT + HEAD_REF_DELETED_EVENT - HEAD_REF_FORCE_PUSHED_EVENT + HEAD_REF_FORCE_PUSHED_EVENT - HEAD_REF_RESTORED_EVENT + HEAD_REF_RESTORED_EVENT - ISSUE_COMMENT + ISSUE_COMMENT - LABELED_EVENT + LABELED_EVENT - LOCKED_EVENT + LOCKED_EVENT - MARKED_AS_DUPLICATE_EVENT + MARKED_AS_DUPLICATE_EVENT - MENTIONED_EVENT + MENTIONED_EVENT - MERGED_EVENT + MERGED_EVENT - MILESTONED_EVENT + MILESTONED_EVENT - MOVED_COLUMNS_IN_PROJECT_EVENT + MOVED_COLUMNS_IN_PROJECT_EVENT - PINNED_EVENT + PINNED_EVENT - PULL_REQUEST_COMMIT + PULL_REQUEST_COMMIT - PULL_REQUEST_COMMIT_COMMENT_THREAD + PULL_REQUEST_COMMIT_COMMENT_THREAD - PULL_REQUEST_REVIEW + PULL_REQUEST_REVIEW - PULL_REQUEST_REVIEW_THREAD + PULL_REQUEST_REVIEW_THREAD - PULL_REQUEST_REVISION_MARKER + PULL_REQUEST_REVISION_MARKER - READY_FOR_REVIEW_EVENT + READY_FOR_REVIEW_EVENT - REFERENCED_EVENT + REFERENCED_EVENT - REMOVED_FROM_PROJECT_EVENT + REMOVED_FROM_PROJECT_EVENT - RENAMED_TITLE_EVENT + RENAMED_TITLE_EVENT - REOPENED_EVENT + REOPENED_EVENT - REVIEW_DISMISSED_EVENT + REVIEW_DISMISSED_EVENT - REVIEW_REQUESTED_EVENT + REVIEW_REQUESTED_EVENT - REVIEW_REQUEST_REMOVED_EVENT + REVIEW_REQUEST_REMOVED_EVENT - SUBSCRIBED_EVENT + SUBSCRIBED_EVENT - TRANSFERRED_EVENT + TRANSFERRED_EVENT - UNASSIGNED_EVENT + UNASSIGNED_EVENT - UNLABELED_EVENT + UNLABELED_EVENT - UNLOCKED_EVENT + UNLOCKED_EVENT - UNPINNED_EVENT + UNPINNED_EVENT - UNSUBSCRIBED_EVENT + UNSUBSCRIBED_EVENT - USER_BLOCKED_EVENT + USER_BLOCKED_EVENT } type PushAllowance implements Node { - actor: PushAllowanceActor + actor: PushAllowanceActor - branchProtectionRule: BranchProtectionRule - id: ID! + branchProtectionRule: BranchProtectionRule + id: ID! } union PushAllowanceActor = Team | User type PushAllowanceConnection { - edges: [PushAllowanceEdge] + edges: [PushAllowanceEdge] - nodes: [PushAllowance] + nodes: [PushAllowance] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type PushAllowanceEdge { - cursor: String! + cursor: String! - node: PushAllowance + node: PushAllowance } type Query { - codeOfConduct( - key: String! - ): CodeOfConduct + codeOfConduct( + key: String! + ): CodeOfConduct - codesOfConduct: [CodeOfConduct] + codesOfConduct: [CodeOfConduct] - license( - key: String! - ): License + license( + key: String! + ): License - licenses: [License]! + licenses: [License]! - marketplaceCategories( - excludeEmpty: Boolean + marketplaceCategories( + excludeEmpty: Boolean - excludeSubcategories: Boolean + excludeSubcategories: Boolean - includeCategories: [String!] - ): [MarketplaceCategory!]! + includeCategories: [String!] + ): [MarketplaceCategory!]! - marketplaceCategory( - slug: String! + marketplaceCategory( + slug: String! - useTopicAliases: Boolean - ): MarketplaceCategory + useTopicAliases: Boolean + ): MarketplaceCategory - marketplaceListing( - slug: String! - ): MarketplaceListing + marketplaceListing( + slug: String! + ): MarketplaceListing - marketplaceListings( - adminId: ID + marketplaceListings( + adminId: ID - after: String + after: String - allStates: Boolean + allStates: Boolean - before: String + before: String - categorySlug: String + categorySlug: String - first: Int + first: Int - last: Int + last: Int - organizationId: ID + organizationId: ID - primaryCategoryOnly: Boolean = false + primaryCategoryOnly: Boolean = false - slugs: [String] + slugs: [String] - useTopicAliases: Boolean + useTopicAliases: Boolean - viewerCanAdmin: Boolean + viewerCanAdmin: Boolean - withFreeTrialsOnly: Boolean = false - ): MarketplaceListingConnection! + withFreeTrialsOnly: Boolean = false + ): MarketplaceListingConnection! - meta: GitHubMetadata! + meta: GitHubMetadata! - node( - id: ID! - ): Node + node( + id: ID! + ): Node - nodes( - ids: [ID!]! - ): [Node]! + nodes( + ids: [ID!]! + ): [Node]! - organization( - login: String! - ): Organization + organization( + login: String! + ): Organization - rateLimit( - dryRun: Boolean = false - ): RateLimit + rateLimit( + dryRun: Boolean = false + ): RateLimit - relay: Query! + relay: Query! - repository( - name: String! + repository( + name: String! - owner: String! - ): Repository + owner: String! + ): Repository - repositoryOwner( - login: String! - ): RepositoryOwner + repositoryOwner( + login: String! + ): RepositoryOwner - resource( - url: URI! - ): UniformResourceLocatable + resource( + url: URI! + ): UniformResourceLocatable - search( - after: String + search( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - query: String! + query: String! - type: SearchType! - ): SearchResultItemConnection! + type: SearchType! + ): SearchResultItemConnection! - securityAdvisories( - after: String + securityAdvisories( + after: String - before: String + before: String - first: Int + first: Int - identifier: SecurityAdvisoryIdentifierFilter + identifier: SecurityAdvisoryIdentifierFilter - last: Int + last: Int - orderBy: SecurityAdvisoryOrder = {field: UPDATED_AT, direction: DESC} + orderBy: SecurityAdvisoryOrder = {field: UPDATED_AT, direction: DESC} - publishedSince: DateTime + publishedSince: DateTime - updatedSince: DateTime - ): SecurityAdvisoryConnection! + updatedSince: DateTime + ): SecurityAdvisoryConnection! - securityAdvisory( - ghsaId: String! - ): SecurityAdvisory + securityAdvisory( + ghsaId: String! + ): SecurityAdvisory - securityVulnerabilities( - after: String + securityVulnerabilities( + after: String - before: String + before: String - ecosystem: SecurityAdvisoryEcosystem + ecosystem: SecurityAdvisoryEcosystem - first: Int + first: Int - last: Int + last: Int - orderBy: SecurityVulnerabilityOrder = {field: UPDATED_AT, direction: DESC} + orderBy: SecurityVulnerabilityOrder = {field: UPDATED_AT, direction: DESC} - package: String + package: String - severities: [SecurityAdvisorySeverity!] - ): SecurityVulnerabilityConnection! + severities: [SecurityAdvisorySeverity!] + ): SecurityVulnerabilityConnection! - sponsorsListing( - slug: String! - ): SponsorsListing + sponsorsListing( + slug: String! + ): SponsorsListing - topic( - name: String! - ): Topic + topic( + name: String! + ): Topic - user( - login: String! - ): User + user( + login: String! + ): User - viewer: User! + viewer: User! } type RateLimit { - cost: Int! + cost: Int! - limit: Int! + limit: Int! - nodeCount: Int! + nodeCount: Int! - remaining: Int! + remaining: Int! - resetAt: DateTime! + resetAt: DateTime! } interface Reactable { - databaseId: Int - id: ID! + databaseId: Int + id: ID! - reactionGroups: [ReactionGroup!] + reactionGroups: [ReactionGroup!] - reactions( - after: String + reactions( + after: String - before: String + before: String - content: ReactionContent + content: ReactionContent - first: Int + first: Int - last: Int + last: Int - orderBy: ReactionOrder - ): ReactionConnection! + orderBy: ReactionOrder + ): ReactionConnection! - viewerCanReact: Boolean! + viewerCanReact: Boolean! } type ReactingUserConnection { - edges: [ReactingUserEdge] + edges: [ReactingUserEdge] - nodes: [User] + nodes: [User] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type ReactingUserEdge { - cursor: String! - node: User! + cursor: String! + node: User! - reactedAt: DateTime! + reactedAt: DateTime! } type Reaction implements Node { - content: ReactionContent! + content: ReactionContent! - createdAt: DateTime! + createdAt: DateTime! - databaseId: Int - id: ID! + databaseId: Int + id: ID! - reactable: Reactable! + reactable: Reactable! - user: User + user: User } type ReactionConnection { - edges: [ReactionEdge] + edges: [ReactionEdge] - nodes: [Reaction] + nodes: [Reaction] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! - viewerHasReacted: Boolean! + viewerHasReacted: Boolean! } enum ReactionContent { - CONFUSED + CONFUSED - EYES + EYES - HEART + HEART - HOORAY + HOORAY - LAUGH + LAUGH - ROCKET + ROCKET - THUMBS_DOWN + THUMBS_DOWN - THUMBS_UP + THUMBS_UP } type ReactionEdge { - cursor: String! + cursor: String! - node: Reaction + node: Reaction } type ReactionGroup { - content: ReactionContent! + content: ReactionContent! - createdAt: DateTime + createdAt: DateTime - subject: Reactable! + subject: Reactable! - users( - after: String + users( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): ReactingUserConnection! + last: Int + ): ReactingUserConnection! - viewerHasReacted: Boolean! + viewerHasReacted: Boolean! } input ReactionOrder { - direction: OrderDirection! + direction: OrderDirection! - field: ReactionOrderField! + field: ReactionOrderField! } enum ReactionOrderField { - CREATED_AT + CREATED_AT } type ReadyForReviewEvent implements Node & UniformResourceLocatable { - actor: Actor + actor: Actor - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - pullRequest: PullRequest! + pullRequest: PullRequest! - resourcePath: URI! + resourcePath: URI! - url: URI! + url: URI! } type Ref implements Node { - associatedPullRequests( - after: String + associatedPullRequests( + after: String - baseRefName: String + baseRefName: String - before: String + before: String - first: Int + first: Int - headRefName: String + headRefName: String - labels: [String!] + labels: [String!] - last: Int + last: Int - orderBy: IssueOrder + orderBy: IssueOrder - states: [PullRequestState!] - ): PullRequestConnection! - id: ID! + states: [PullRequestState!] + ): PullRequestConnection! + id: ID! - name: String! + name: String! - prefix: String! + prefix: String! - repository: Repository! + repository: Repository! - target: GitObject! + target: GitObject! } type RefConnection { - edges: [RefEdge] + edges: [RefEdge] - nodes: [Ref] + nodes: [Ref] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type RefEdge { - cursor: String! + cursor: String! - node: Ref + node: Ref } input RefOrder { - direction: OrderDirection! + direction: OrderDirection! - field: RefOrderField! + field: RefOrderField! } enum RefOrderField { - ALPHABETICAL + ALPHABETICAL - TAG_COMMIT_DATE + TAG_COMMIT_DATE } type ReferencedEvent implements Node { - actor: Actor + actor: Actor - commit: Commit + commit: Commit - commitRepository: Repository! + commitRepository: Repository! - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - isCrossRepository: Boolean! + isCrossRepository: Boolean! - isDirectReference: Boolean! + isDirectReference: Boolean! - subject: ReferencedSubject! + subject: ReferencedSubject! } union ReferencedSubject = Issue | PullRequest type RegistryPackage implements Node { - color: String! - id: ID! + color: String! + id: ID! - latestVersion: RegistryPackageVersion + latestVersion: RegistryPackageVersion - name: String! + name: String! - nameWithOwner: String! + nameWithOwner: String! - packageFileByGuid( - guid: String! - ): RegistryPackageFile + packageFileByGuid( + guid: String! + ): RegistryPackageFile - packageFileBySha256( - sha256: String! - ): RegistryPackageFile + packageFileBySha256( + sha256: String! + ): RegistryPackageFile - packageType: RegistryPackageType! + packageType: RegistryPackageType! - preReleaseVersions( - after: String + preReleaseVersions( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): RegistryPackageVersionConnection + last: Int + ): RegistryPackageVersionConnection - registryPackageType: String + registryPackageType: String - repository: Repository + repository: Repository - statistics: RegistryPackageStatistics + statistics: RegistryPackageStatistics - tags( - after: String + tags( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): RegistryPackageTagConnection! + last: Int + ): RegistryPackageTagConnection! - topics( - after: String + topics( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): TopicConnection + last: Int + ): TopicConnection - version( - version: String! - ): RegistryPackageVersion + version( + version: String! + ): RegistryPackageVersion - versionByPlatform( - platform: String! + versionByPlatform( + platform: String! - version: String! - ): RegistryPackageVersion + version: String! + ): RegistryPackageVersion - versionBySha256( - sha256: String! - ): RegistryPackageVersion + versionBySha256( + sha256: String! + ): RegistryPackageVersion - versions( - after: String + versions( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): RegistryPackageVersionConnection! + last: Int + ): RegistryPackageVersionConnection! - versionsByMetadatum( - after: String + versionsByMetadatum( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - metadatum: RegistryPackageMetadatum! - ): RegistryPackageVersionConnection + metadatum: RegistryPackageMetadatum! + ): RegistryPackageVersionConnection } type RegistryPackageConnection { - edges: [RegistryPackageEdge] + edges: [RegistryPackageEdge] - nodes: [RegistryPackage] + nodes: [RegistryPackage] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type RegistryPackageDependency implements Node { - dependencyType: RegistryPackageDependencyType! - id: ID! + dependencyType: RegistryPackageDependencyType! + id: ID! - name: String! + name: String! - version: String! + version: String! } type RegistryPackageDependencyConnection { - edges: [RegistryPackageDependencyEdge] + edges: [RegistryPackageDependencyEdge] - nodes: [RegistryPackageDependency] + nodes: [RegistryPackageDependency] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type RegistryPackageDependencyEdge { - cursor: String! + cursor: String! - node: RegistryPackageDependency + node: RegistryPackageDependency } enum RegistryPackageDependencyType { - BUNDLED + BUNDLED - DEFAULT + DEFAULT - DEV + DEV - OPTIONAL + OPTIONAL - PEER + PEER - TEST + TEST } type RegistryPackageEdge { - cursor: String! + cursor: String! - node: RegistryPackage + node: RegistryPackage } type RegistryPackageFile implements Node { - guid: String - id: ID! + guid: String + id: ID! - md5: String + md5: String - metadataUrl: URI! + metadataUrl: URI! - name: String! + name: String! - packageVersion: RegistryPackageVersion! + packageVersion: RegistryPackageVersion! - sha1: String + sha1: String - sha256: String + sha256: String - size: Int + size: Int - updatedAt: DateTime! + updatedAt: DateTime! - url: URI! + url: URI! } type RegistryPackageFileConnection { - edges: [RegistryPackageFileEdge] + edges: [RegistryPackageFileEdge] - nodes: [RegistryPackageFile] + nodes: [RegistryPackageFile] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type RegistryPackageFileEdge { - cursor: String! + cursor: String! - node: RegistryPackageFile + node: RegistryPackageFile } enum RegistryPackageFileState { - NEW + NEW - UPLOADED + UPLOADED } input RegistryPackageMetadatum { - name: String! + name: String! - update: Boolean + update: Boolean - value: String! + value: String! } interface RegistryPackageOwner { - id: ID! + id: ID! - registryPackages( - after: String + registryPackages( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - name: String + name: String - names: [String] + names: [String] - packageType: RegistryPackageType + packageType: RegistryPackageType - publicOnly: Boolean = false + publicOnly: Boolean = false - registryPackageType: String + registryPackageType: String - repositoryId: ID - ): RegistryPackageConnection! + repositoryId: ID + ): RegistryPackageConnection! } interface RegistryPackageSearch { - id: ID! + id: ID! - registryPackagesForQuery( - after: String + registryPackagesForQuery( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - packageType: RegistryPackageType + packageType: RegistryPackageType - query: String - ): RegistryPackageConnection! + query: String + ): RegistryPackageConnection! } type RegistryPackageStatistics { - downloadsThisMonth: Int! + downloadsThisMonth: Int! - downloadsThisWeek: Int! + downloadsThisWeek: Int! - downloadsThisYear: Int! + downloadsThisYear: Int! - downloadsToday: Int! + downloadsToday: Int! - downloadsTotalCount: Int! + downloadsTotalCount: Int! } type RegistryPackageTag implements Node { - id: ID! + id: ID! - name: String! + name: String! - version: RegistryPackageVersion + version: RegistryPackageVersion } type RegistryPackageTagConnection { - edges: [RegistryPackageTagEdge] + edges: [RegistryPackageTagEdge] - nodes: [RegistryPackageTag] + nodes: [RegistryPackageTag] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type RegistryPackageTagEdge { - cursor: String! + cursor: String! - node: RegistryPackageTag + node: RegistryPackageTag } enum RegistryPackageType { - DEBIAN + DEBIAN - DOCKER + DOCKER - MAVEN + MAVEN - NPM + NPM - NUGET + NUGET - PYTHON + PYTHON - RUBYGEMS + RUBYGEMS } type RegistryPackageVersion implements Node { - dependencies( - after: String + dependencies( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - type: RegistryPackageDependencyType - ): RegistryPackageDependencyConnection! + type: RegistryPackageDependencyType + ): RegistryPackageDependencyConnection! - fileByName( - filename: String! - ): RegistryPackageFile + fileByName( + filename: String! + ): RegistryPackageFile - files( - after: String + files( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): RegistryPackageFileConnection! - id: ID! + last: Int + ): RegistryPackageFileConnection! + id: ID! - installationCommand: String + installationCommand: String - manifest: String + manifest: String - platform: String + platform: String - readme: String + readme: String - readmeHtml: HTML + readmeHtml: HTML - registryPackage: RegistryPackage + registryPackage: RegistryPackage - release: Release + release: Release - sha256: String + sha256: String - size: Int + size: Int - statistics: RegistryPackageVersionStatistics + statistics: RegistryPackageVersionStatistics - summary: String + summary: String - updatedAt: DateTime! + updatedAt: DateTime! - version: String! + version: String! - viewerCanEdit: Boolean! + viewerCanEdit: Boolean! } type RegistryPackageVersionConnection { - edges: [RegistryPackageVersionEdge] + edges: [RegistryPackageVersionEdge] - nodes: [RegistryPackageVersion] + nodes: [RegistryPackageVersion] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type RegistryPackageVersionEdge { - cursor: String! + cursor: String! - node: RegistryPackageVersion + node: RegistryPackageVersion } type RegistryPackageVersionStatistics { - downloadsThisMonth: Int! + downloadsThisMonth: Int! - downloadsThisWeek: Int! + downloadsThisWeek: Int! - downloadsThisYear: Int! + downloadsThisYear: Int! - downloadsToday: Int! + downloadsToday: Int! - downloadsTotalCount: Int! + downloadsTotalCount: Int! } type Release implements Node & UniformResourceLocatable { - author: User + author: User - createdAt: DateTime! + createdAt: DateTime! - description: String - id: ID! + description: String + id: ID! - isDraft: Boolean! + isDraft: Boolean! - isPrerelease: Boolean! + isPrerelease: Boolean! - name: String + name: String - publishedAt: DateTime + publishedAt: DateTime - releaseAssets( - after: String + releaseAssets( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - name: String - ): ReleaseAssetConnection! + name: String + ): ReleaseAssetConnection! - resourcePath: URI! + resourcePath: URI! - tag: Ref + tag: Ref - tagName: String! + tagName: String! - updatedAt: DateTime! + updatedAt: DateTime! - url: URI! + url: URI! } type ReleaseAsset implements Node { - contentType: String! + contentType: String! - createdAt: DateTime! + createdAt: DateTime! - downloadCount: Int! + downloadCount: Int! - downloadUrl: URI! - id: ID! + downloadUrl: URI! + id: ID! - name: String! + name: String! - release: Release + release: Release - size: Int! + size: Int! - updatedAt: DateTime! + updatedAt: DateTime! - uploadedBy: User! + uploadedBy: User! - url: URI! + url: URI! } type ReleaseAssetConnection { - edges: [ReleaseAssetEdge] + edges: [ReleaseAssetEdge] - nodes: [ReleaseAsset] + nodes: [ReleaseAsset] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type ReleaseAssetEdge { - cursor: String! + cursor: String! - node: ReleaseAsset + node: ReleaseAsset } type ReleaseConnection { - edges: [ReleaseEdge] + edges: [ReleaseEdge] - nodes: [Release] + nodes: [Release] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type ReleaseEdge { - cursor: String! + cursor: String! - node: Release + node: Release } input ReleaseOrder { - direction: OrderDirection! + direction: OrderDirection! - field: ReleaseOrderField! + field: ReleaseOrderField! } enum ReleaseOrderField { - CREATED_AT + CREATED_AT - NAME + NAME } input RemoveAssigneesFromAssignableInput { - assignableId: ID! + assignableId: ID! - assigneeIds: [ID!]! + assigneeIds: [ID!]! - clientMutationId: String + clientMutationId: String } type RemoveAssigneesFromAssignablePayload { - assignable: Assignable + assignable: Assignable - clientMutationId: String + clientMutationId: String } input RemoveLabelsFromLabelableInput { - clientMutationId: String + clientMutationId: String - labelIds: [ID!]! + labelIds: [ID!]! - labelableId: ID! + labelableId: ID! } type RemoveLabelsFromLabelablePayload { - clientMutationId: String + clientMutationId: String - labelable: Labelable + labelable: Labelable } input RemoveOutsideCollaboratorInput { - clientMutationId: String + clientMutationId: String - organizationId: ID! + organizationId: ID! - userId: ID! + userId: ID! } type RemoveOutsideCollaboratorPayload { - clientMutationId: String + clientMutationId: String - removedUser: User + removedUser: User } input RemoveReactionInput { - clientMutationId: String + clientMutationId: String - content: ReactionContent! + content: ReactionContent! - subjectId: ID! + subjectId: ID! } type RemoveReactionPayload { - clientMutationId: String + clientMutationId: String - reaction: Reaction + reaction: Reaction - subject: Reactable + subject: Reactable } input RemoveStarInput { - clientMutationId: String + clientMutationId: String - starrableId: ID! + starrableId: ID! } type RemoveStarPayload { - clientMutationId: String + clientMutationId: String - starrable: Starrable + starrable: Starrable } type RemovedFromProjectEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! + createdAt: DateTime! - databaseId: Int - id: ID! + databaseId: Int + id: ID! } type RenamedTitleEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! + createdAt: DateTime! - currentTitle: String! - id: ID! + currentTitle: String! + id: ID! - previousTitle: String! + previousTitle: String! - subject: RenamedTitleSubject! + subject: RenamedTitleSubject! } union RenamedTitleSubject = Issue | PullRequest input ReopenIssueInput { - clientMutationId: String + clientMutationId: String - issueId: ID! + issueId: ID! } type ReopenIssuePayload { - clientMutationId: String + clientMutationId: String - issue: Issue + issue: Issue } input ReopenPullRequestInput { - clientMutationId: String + clientMutationId: String - pullRequestId: ID! + pullRequestId: ID! } type ReopenPullRequestPayload { - clientMutationId: String + clientMutationId: String - pullRequest: PullRequest + pullRequest: PullRequest } type ReopenedEvent implements Node { - actor: Actor + actor: Actor - closable: Closable! + closable: Closable! - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! } enum ReportedContentClassifiers { - ABUSE + ABUSE - OFF_TOPIC + OFF_TOPIC - OUTDATED + OUTDATED - RESOLVED + RESOLVED - SPAM + SPAM } type Repository implements Node & ProjectOwner & RegistryPackageOwner & RepositoryInfo & Starrable & Subscribable & UniformResourceLocatable { - assignableUsers( - after: String + assignableUsers( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): UserConnection! + last: Int + ): UserConnection! - branchProtectionRules( - after: String + branchProtectionRules( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): BranchProtectionRuleConnection! + last: Int + ): BranchProtectionRuleConnection! - codeOfConduct: CodeOfConduct + codeOfConduct: CodeOfConduct - collaborators( - affiliation: CollaboratorAffiliation + collaborators( + affiliation: CollaboratorAffiliation - after: String + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): RepositoryCollaboratorConnection + last: Int + ): RepositoryCollaboratorConnection - commitComments( - after: String + commitComments( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): CommitCommentConnection! + last: Int + ): CommitCommentConnection! - createdAt: DateTime! + createdAt: DateTime! - databaseId: Int + databaseId: Int - defaultBranchRef: Ref + defaultBranchRef: Ref - deployKeys( - after: String + deployKeys( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): DeployKeyConnection! + last: Int + ): DeployKeyConnection! - deployments( - after: String + deployments( + after: String - before: String + before: String - environments: [String!] + environments: [String!] - first: Int + first: Int - last: Int + last: Int - orderBy: DeploymentOrder = {field: CREATED_AT, direction: ASC} - ): DeploymentConnection! + orderBy: DeploymentOrder = {field: CREATED_AT, direction: ASC} + ): DeploymentConnection! - description: String + description: String - descriptionHTML: HTML! + descriptionHTML: HTML! - diskUsage: Int + diskUsage: Int - forkCount: Int! + forkCount: Int! - forks( - affiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] + forks( + affiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] - after: String + after: String - before: String + before: String - first: Int + first: Int - isLocked: Boolean + isLocked: Boolean - last: Int + last: Int - orderBy: RepositoryOrder + orderBy: RepositoryOrder - ownerAffiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] + ownerAffiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] - privacy: RepositoryPrivacy - ): RepositoryConnection! + privacy: RepositoryPrivacy + ): RepositoryConnection! - hasIssuesEnabled: Boolean! + hasIssuesEnabled: Boolean! - hasWikiEnabled: Boolean! + hasWikiEnabled: Boolean! - homepageUrl: URI - id: ID! + homepageUrl: URI + id: ID! - isArchived: Boolean! + isArchived: Boolean! - isDisabled: Boolean! + isDisabled: Boolean! - isFork: Boolean! + isFork: Boolean! - isLocked: Boolean! + isLocked: Boolean! - isMirror: Boolean! + isMirror: Boolean! - isPrivate: Boolean! + isPrivate: Boolean! - isTemplate: Boolean! + isTemplate: Boolean! - issue( - number: Int! - ): Issue + issue( + number: Int! + ): Issue - issueOrPullRequest( - number: Int! - ): IssueOrPullRequest + issueOrPullRequest( + number: Int! + ): IssueOrPullRequest - issues( - after: String + issues( + after: String - before: String + before: String - filterBy: IssueFilters + filterBy: IssueFilters - first: Int + first: Int - labels: [String!] + labels: [String!] - last: Int + last: Int - orderBy: IssueOrder + orderBy: IssueOrder - states: [IssueState!] - ): IssueConnection! + states: [IssueState!] + ): IssueConnection! - label( - name: String! - ): Label + label( + name: String! + ): Label - labels( - after: String + labels( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - query: String - ): LabelConnection + query: String + ): LabelConnection - languages( - after: String + languages( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: LanguageOrder - ): LanguageConnection + orderBy: LanguageOrder + ): LanguageConnection - licenseInfo: License + licenseInfo: License - lockReason: RepositoryLockReason + lockReason: RepositoryLockReason - mentionableUsers( - after: String + mentionableUsers( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): UserConnection! + last: Int + ): UserConnection! - mergeCommitAllowed: Boolean! + mergeCommitAllowed: Boolean! - milestone( - number: Int! - ): Milestone + milestone( + number: Int! + ): Milestone - milestones( - after: String + milestones( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: MilestoneOrder + orderBy: MilestoneOrder - states: [MilestoneState!] - ): MilestoneConnection + states: [MilestoneState!] + ): MilestoneConnection - mirrorUrl: URI + mirrorUrl: URI - name: String! + name: String! - nameWithOwner: String! + nameWithOwner: String! - object( - expression: String + object( + expression: String - oid: GitObjectID - ): GitObject + oid: GitObjectID + ): GitObject - openGraphImageUrl: URI! + openGraphImageUrl: URI! - owner: RepositoryOwner! + owner: RepositoryOwner! - parent: Repository + parent: Repository - primaryLanguage: Language + primaryLanguage: Language - project( - number: Int! - ): Project + project( + number: Int! + ): Project - projects( - after: String + projects( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: ProjectOrder + orderBy: ProjectOrder - search: String + search: String - states: [ProjectState!] - ): ProjectConnection! + states: [ProjectState!] + ): ProjectConnection! - projectsResourcePath: URI! + projectsResourcePath: URI! - projectsUrl: URI! + projectsUrl: URI! - pullRequest( - number: Int! - ): PullRequest + pullRequest( + number: Int! + ): PullRequest - pullRequests( - after: String + pullRequests( + after: String - baseRefName: String + baseRefName: String - before: String + before: String - first: Int + first: Int - headRefName: String + headRefName: String - labels: [String!] + labels: [String!] - last: Int + last: Int - orderBy: IssueOrder + orderBy: IssueOrder - states: [PullRequestState!] - ): PullRequestConnection! + states: [PullRequestState!] + ): PullRequestConnection! - pushedAt: DateTime + pushedAt: DateTime - rebaseMergeAllowed: Boolean! + rebaseMergeAllowed: Boolean! - ref( - qualifiedName: String! - ): Ref + ref( + qualifiedName: String! + ): Ref - refs( - after: String + refs( + after: String - before: String + before: String - direction: OrderDirection + direction: OrderDirection - first: Int + first: Int - last: Int + last: Int - orderBy: RefOrder + orderBy: RefOrder - refPrefix: String! - ): RefConnection + refPrefix: String! + ): RefConnection - registryPackages( - after: String + registryPackages( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - name: String + name: String - names: [String] + names: [String] - packageType: RegistryPackageType + packageType: RegistryPackageType - publicOnly: Boolean = false + publicOnly: Boolean = false - registryPackageType: String + registryPackageType: String - repositoryId: ID - ): RegistryPackageConnection! + repositoryId: ID + ): RegistryPackageConnection! - release( - tagName: String! - ): Release + release( + tagName: String! + ): Release - releases( - after: String + releases( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: ReleaseOrder - ): ReleaseConnection! + orderBy: ReleaseOrder + ): ReleaseConnection! - repositoryTopics( - after: String + repositoryTopics( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): RepositoryTopicConnection! + last: Int + ): RepositoryTopicConnection! - resourcePath: URI! + resourcePath: URI! - shortDescriptionHTML( - limit: Int = 200 - ): HTML! + shortDescriptionHTML( + limit: Int = 200 + ): HTML! - squashMergeAllowed: Boolean! + squashMergeAllowed: Boolean! - sshUrl: GitSSHRemote! + sshUrl: GitSSHRemote! - stargazers( - after: String + stargazers( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: StarOrder - ): StargazerConnection! + orderBy: StarOrder + ): StargazerConnection! - templateRepository: Repository + templateRepository: Repository - updatedAt: DateTime! + updatedAt: DateTime! - url: URI! + url: URI! - usesCustomOpenGraphImage: Boolean! + usesCustomOpenGraphImage: Boolean! - viewerCanAdminister: Boolean! + viewerCanAdminister: Boolean! - viewerCanCreateProjects: Boolean! + viewerCanCreateProjects: Boolean! - viewerCanSubscribe: Boolean! + viewerCanSubscribe: Boolean! - viewerCanUpdateTopics: Boolean! + viewerCanUpdateTopics: Boolean! - viewerHasStarred: Boolean! + viewerHasStarred: Boolean! - viewerPermission: RepositoryPermission + viewerPermission: RepositoryPermission - viewerSubscription: SubscriptionState + viewerSubscription: SubscriptionState - watchers( - after: String + watchers( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): UserConnection! + last: Int + ): UserConnection! } enum RepositoryAffiliation { - COLLABORATOR + COLLABORATOR - ORGANIZATION_MEMBER + ORGANIZATION_MEMBER - OWNER + OWNER } enum RepositoryCollaboratorAffiliation { - ALL + ALL - OUTSIDE + OUTSIDE } type RepositoryCollaboratorConnection { - edges: [RepositoryCollaboratorEdge] + edges: [RepositoryCollaboratorEdge] - nodes: [User] + nodes: [User] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type RepositoryCollaboratorEdge { - cursor: String! - node: User! + cursor: String! + node: User! - permission: RepositoryPermission! + permission: RepositoryPermission! - permissionSources: [PermissionSource!] + permissionSources: [PermissionSource!] } type RepositoryConnection { - edges: [RepositoryEdge] + edges: [RepositoryEdge] - nodes: [Repository] + nodes: [Repository] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! - totalDiskUsage: Int! + totalDiskUsage: Int! } enum RepositoryContributionType { - COMMIT + COMMIT - ISSUE + ISSUE - PULL_REQUEST + PULL_REQUEST - PULL_REQUEST_REVIEW + PULL_REQUEST_REVIEW - REPOSITORY + REPOSITORY } type RepositoryEdge { - cursor: String! + cursor: String! - node: Repository + node: Repository } interface RepositoryInfo { - createdAt: DateTime! + createdAt: DateTime! - description: String + description: String - descriptionHTML: HTML! + descriptionHTML: HTML! - forkCount: Int! + forkCount: Int! - hasIssuesEnabled: Boolean! + hasIssuesEnabled: Boolean! - hasWikiEnabled: Boolean! + hasWikiEnabled: Boolean! - homepageUrl: URI + homepageUrl: URI - isArchived: Boolean! + isArchived: Boolean! - isFork: Boolean! + isFork: Boolean! - isLocked: Boolean! + isLocked: Boolean! - isMirror: Boolean! + isMirror: Boolean! - isPrivate: Boolean! + isPrivate: Boolean! - isTemplate: Boolean! + isTemplate: Boolean! - licenseInfo: License + licenseInfo: License - lockReason: RepositoryLockReason + lockReason: RepositoryLockReason - mirrorUrl: URI + mirrorUrl: URI - name: String! + name: String! - nameWithOwner: String! + nameWithOwner: String! - openGraphImageUrl: URI! + openGraphImageUrl: URI! - owner: RepositoryOwner! + owner: RepositoryOwner! - pushedAt: DateTime + pushedAt: DateTime - resourcePath: URI! + resourcePath: URI! - shortDescriptionHTML( - limit: Int = 200 - ): HTML! + shortDescriptionHTML( + limit: Int = 200 + ): HTML! - updatedAt: DateTime! + updatedAt: DateTime! - url: URI! + url: URI! - usesCustomOpenGraphImage: Boolean! + usesCustomOpenGraphImage: Boolean! } type RepositoryInvitation implements Node { - id: ID! + id: ID! - invitee: User! + invitee: User! - inviter: User! + inviter: User! - permission: RepositoryPermission! + permission: RepositoryPermission! - repository: RepositoryInfo + repository: RepositoryInfo } type RepositoryInvitationEdge { - cursor: String! + cursor: String! - node: RepositoryInvitation + node: RepositoryInvitation } enum RepositoryLockReason { - BILLING + BILLING - MIGRATING + MIGRATING - MOVING + MOVING - RENAME + RENAME } interface RepositoryNode { - repository: Repository! + repository: Repository! } input RepositoryOrder { - direction: OrderDirection! + direction: OrderDirection! - field: RepositoryOrderField! + field: RepositoryOrderField! } enum RepositoryOrderField { - CREATED_AT + CREATED_AT - NAME + NAME - PUSHED_AT + PUSHED_AT - STARGAZERS + STARGAZERS - UPDATED_AT + UPDATED_AT } interface RepositoryOwner { - avatarUrl( - size: Int - ): URI! - id: ID! + avatarUrl( + size: Int + ): URI! + id: ID! - login: String! + login: String! - pinnedRepositories( - affiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] + pinnedRepositories( + affiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] - after: String + after: String - before: String + before: String - first: Int + first: Int - isLocked: Boolean + isLocked: Boolean - last: Int + last: Int - orderBy: RepositoryOrder + orderBy: RepositoryOrder - ownerAffiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] + ownerAffiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] - privacy: RepositoryPrivacy - ): RepositoryConnection! @deprecated(reason: "pinnedRepositories will be removed Use ProfileOwner.pinnedItems instead. Removal on 2019-10-01 UTC.") + privacy: RepositoryPrivacy + ): RepositoryConnection! @deprecated(reason: "pinnedRepositories will be removed Use ProfileOwner.pinnedItems instead. Removal on 2019-10-01 UTC.") - repositories( - affiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] + repositories( + affiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] - after: String + after: String - before: String + before: String - first: Int + first: Int - isFork: Boolean + isFork: Boolean - isLocked: Boolean + isLocked: Boolean - last: Int + last: Int - orderBy: RepositoryOrder + orderBy: RepositoryOrder - ownerAffiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] + ownerAffiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] - privacy: RepositoryPrivacy - ): RepositoryConnection! + privacy: RepositoryPrivacy + ): RepositoryConnection! - repository( - name: String! - ): Repository + repository( + name: String! + ): Repository - resourcePath: URI! + resourcePath: URI! - url: URI! + url: URI! } enum RepositoryPermission { - ADMIN + ADMIN - MAINTAIN + MAINTAIN - READ + READ - TRIAGE + TRIAGE - WRITE + WRITE } enum RepositoryPrivacy { - PRIVATE + PRIVATE - PUBLIC + PUBLIC } type RepositoryTopic implements Node & UniformResourceLocatable { - id: ID! + id: ID! - resourcePath: URI! + resourcePath: URI! - topic: Topic! + topic: Topic! - url: URI! + url: URI! } type RepositoryTopicConnection { - edges: [RepositoryTopicEdge] + edges: [RepositoryTopicEdge] - nodes: [RepositoryTopic] + nodes: [RepositoryTopic] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type RepositoryTopicEdge { - cursor: String! + cursor: String! - node: RepositoryTopic + node: RepositoryTopic } enum RepositoryVisibility { - INTERNAL + INTERNAL - PRIVATE + PRIVATE - PUBLIC + PUBLIC } input RequestReviewsInput { - clientMutationId: String + clientMutationId: String - pullRequestId: ID! + pullRequestId: ID! - teamIds: [ID!] + teamIds: [ID!] - union: Boolean + union: Boolean - userIds: [ID!] + userIds: [ID!] } type RequestReviewsPayload { - clientMutationId: String + clientMutationId: String - pullRequest: PullRequest + pullRequest: PullRequest - requestedReviewersEdge: UserEdge + requestedReviewersEdge: UserEdge } union RequestedReviewer = Mannequin | Team | User input ResolveReviewThreadInput { - clientMutationId: String + clientMutationId: String - threadId: ID! + threadId: ID! } type ResolveReviewThreadPayload { - clientMutationId: String + clientMutationId: String - thread: PullRequestReviewThread + thread: PullRequestReviewThread } type RestrictedContribution implements Contribution { - isRestricted: Boolean! + isRestricted: Boolean! - occurredAt: DateTime! + occurredAt: DateTime! - resourcePath: URI! + resourcePath: URI! - url: URI! + url: URI! - user: User! + user: User! } type ReviewDismissalAllowance implements Node { - actor: ReviewDismissalAllowanceActor + actor: ReviewDismissalAllowanceActor - branchProtectionRule: BranchProtectionRule - id: ID! + branchProtectionRule: BranchProtectionRule + id: ID! } union ReviewDismissalAllowanceActor = Team | User type ReviewDismissalAllowanceConnection { - edges: [ReviewDismissalAllowanceEdge] + edges: [ReviewDismissalAllowanceEdge] - nodes: [ReviewDismissalAllowance] + nodes: [ReviewDismissalAllowance] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type ReviewDismissalAllowanceEdge { - cursor: String! + cursor: String! - node: ReviewDismissalAllowance + node: ReviewDismissalAllowance } type ReviewDismissedEvent implements Node & UniformResourceLocatable { - actor: Actor + actor: Actor - createdAt: DateTime! + createdAt: DateTime! - databaseId: Int + databaseId: Int - dismissalMessage: String + dismissalMessage: String - dismissalMessageHTML: String - id: ID! + dismissalMessageHTML: String + id: ID! - previousReviewState: PullRequestReviewState! + previousReviewState: PullRequestReviewState! - pullRequest: PullRequest! + pullRequest: PullRequest! - pullRequestCommit: PullRequestCommit + pullRequestCommit: PullRequestCommit - resourcePath: URI! + resourcePath: URI! - review: PullRequestReview + review: PullRequestReview - url: URI! + url: URI! } type ReviewRequest implements Node { - databaseId: Int - id: ID! + databaseId: Int + id: ID! - pullRequest: PullRequest! + pullRequest: PullRequest! - requestedReviewer: RequestedReviewer + requestedReviewer: RequestedReviewer } type ReviewRequestConnection { - edges: [ReviewRequestEdge] + edges: [ReviewRequestEdge] - nodes: [ReviewRequest] + nodes: [ReviewRequest] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type ReviewRequestEdge { - cursor: String! + cursor: String! - node: ReviewRequest + node: ReviewRequest } type ReviewRequestRemovedEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - pullRequest: PullRequest! + pullRequest: PullRequest! - requestedReviewer: RequestedReviewer + requestedReviewer: RequestedReviewer } type ReviewRequestedEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - pullRequest: PullRequest! + pullRequest: PullRequest! - requestedReviewer: RequestedReviewer + requestedReviewer: RequestedReviewer } type SavedReply implements Node { - body: String! + body: String! - bodyHTML: HTML! + bodyHTML: HTML! - databaseId: Int - id: ID! + databaseId: Int + id: ID! - title: String! + title: String! - user: Actor + user: Actor } type SavedReplyConnection { - edges: [SavedReplyEdge] + edges: [SavedReplyEdge] - nodes: [SavedReply] + nodes: [SavedReply] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type SavedReplyEdge { - cursor: String! + cursor: String! - node: SavedReply + node: SavedReply } input SavedReplyOrder { - direction: OrderDirection! + direction: OrderDirection! - field: SavedReplyOrderField! + field: SavedReplyOrderField! } enum SavedReplyOrderField { - UPDATED_AT + UPDATED_AT } union SearchResultItem = App | Issue | MarketplaceListing | Organization | PullRequest | Repository | User type SearchResultItemConnection { - codeCount: Int! + codeCount: Int! - edges: [SearchResultItemEdge] + edges: [SearchResultItemEdge] - issueCount: Int! + issueCount: Int! - nodes: [SearchResultItem] + nodes: [SearchResultItem] - pageInfo: PageInfo! + pageInfo: PageInfo! - repositoryCount: Int! + repositoryCount: Int! - userCount: Int! + userCount: Int! - wikiCount: Int! + wikiCount: Int! } type SearchResultItemEdge { - cursor: String! + cursor: String! - node: SearchResultItem + node: SearchResultItem - textMatches: [TextMatch] + textMatches: [TextMatch] } enum SearchType { - ISSUE + ISSUE - REPOSITORY + REPOSITORY - USER + USER } type SecurityAdvisory implements Node { - databaseId: Int + databaseId: Int - description: String! + description: String! - ghsaId: String! - id: ID! + ghsaId: String! + id: ID! - identifiers: [SecurityAdvisoryIdentifier!]! + identifiers: [SecurityAdvisoryIdentifier!]! - origin: String! + origin: String! - publishedAt: DateTime! + publishedAt: DateTime! - references: [SecurityAdvisoryReference!]! + references: [SecurityAdvisoryReference!]! - severity: SecurityAdvisorySeverity! + severity: SecurityAdvisorySeverity! - summary: String! + summary: String! - updatedAt: DateTime! + updatedAt: DateTime! - vulnerabilities( - after: String + vulnerabilities( + after: String - before: String + before: String - ecosystem: SecurityAdvisoryEcosystem + ecosystem: SecurityAdvisoryEcosystem - first: Int + first: Int - last: Int + last: Int - orderBy: SecurityVulnerabilityOrder = {field: UPDATED_AT, direction: DESC} + orderBy: SecurityVulnerabilityOrder = {field: UPDATED_AT, direction: DESC} - package: String + package: String - severities: [SecurityAdvisorySeverity!] - ): SecurityVulnerabilityConnection! + severities: [SecurityAdvisorySeverity!] + ): SecurityVulnerabilityConnection! - withdrawnAt: DateTime + withdrawnAt: DateTime } type SecurityAdvisoryConnection { - edges: [SecurityAdvisoryEdge] + edges: [SecurityAdvisoryEdge] - nodes: [SecurityAdvisory] + nodes: [SecurityAdvisory] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } enum SecurityAdvisoryEcosystem { - MAVEN + MAVEN - NPM + NPM - NUGET + NUGET - PIP + PIP - RUBYGEMS + RUBYGEMS } type SecurityAdvisoryEdge { - cursor: String! + cursor: String! - node: SecurityAdvisory + node: SecurityAdvisory } type SecurityAdvisoryIdentifier { - type: String! + type: String! - value: String! + value: String! } input SecurityAdvisoryIdentifierFilter { - type: SecurityAdvisoryIdentifierType! + type: SecurityAdvisoryIdentifierType! - value: String! + value: String! } enum SecurityAdvisoryIdentifierType { - CVE + CVE - GHSA + GHSA } input SecurityAdvisoryOrder { - direction: OrderDirection! + direction: OrderDirection! - field: SecurityAdvisoryOrderField! + field: SecurityAdvisoryOrderField! } enum SecurityAdvisoryOrderField { - PUBLISHED_AT + PUBLISHED_AT - UPDATED_AT + UPDATED_AT } type SecurityAdvisoryPackage { - ecosystem: SecurityAdvisoryEcosystem! + ecosystem: SecurityAdvisoryEcosystem! - name: String! + name: String! } type SecurityAdvisoryPackageVersion { - identifier: String! + identifier: String! } type SecurityAdvisoryReference { - url: URI! + url: URI! } enum SecurityAdvisorySeverity { - CRITICAL + CRITICAL - HIGH + HIGH - LOW + LOW - MODERATE + MODERATE } type SecurityVulnerability { - advisory: SecurityAdvisory! + advisory: SecurityAdvisory! - firstPatchedVersion: SecurityAdvisoryPackageVersion + firstPatchedVersion: SecurityAdvisoryPackageVersion - package: SecurityAdvisoryPackage! + package: SecurityAdvisoryPackage! - severity: SecurityAdvisorySeverity! + severity: SecurityAdvisorySeverity! - updatedAt: DateTime! + updatedAt: DateTime! - vulnerableVersionRange: String! + vulnerableVersionRange: String! } type SecurityVulnerabilityConnection { - edges: [SecurityVulnerabilityEdge] + edges: [SecurityVulnerabilityEdge] - nodes: [SecurityVulnerability] + nodes: [SecurityVulnerability] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type SecurityVulnerabilityEdge { - cursor: String! + cursor: String! - node: SecurityVulnerability + node: SecurityVulnerability } input SecurityVulnerabilityOrder { - direction: OrderDirection! + direction: OrderDirection! - field: SecurityVulnerabilityOrderField! + field: SecurityVulnerabilityOrderField! } enum SecurityVulnerabilityOrderField { - UPDATED_AT + UPDATED_AT } type SmimeSignature implements GitSignature { - email: String! + email: String! - isValid: Boolean! + isValid: Boolean! - payload: String! + payload: String! - signature: String! + signature: String! - signer: User + signer: User - state: GitSignatureState! + state: GitSignatureState! - wasSignedByGitHub: Boolean! + wasSignedByGitHub: Boolean! } interface Sponsorable { - sponsorshipsAsMaintainer( - after: String + sponsorshipsAsMaintainer( + after: String - before: String + before: String - first: Int + first: Int - includePrivate: Boolean = false + includePrivate: Boolean = false - last: Int + last: Int - orderBy: SponsorshipOrder - ): SponsorshipConnection! + orderBy: SponsorshipOrder + ): SponsorshipConnection! - sponsorshipsAsSponsor( - after: String + sponsorshipsAsSponsor( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: SponsorshipOrder - ): SponsorshipConnection! + orderBy: SponsorshipOrder + ): SponsorshipConnection! } type SponsorsListing implements Node { - fullDescription: String! - id: ID! + fullDescription: String! + id: ID! - shortDescription: String! + shortDescription: String! - slug: String! + slug: String! } type Sponsorship implements Node { - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - maintainer: User! + maintainer: User! - privacyLevel: SponsorshipPrivacy! + privacyLevel: SponsorshipPrivacy! - sponsor: User + sponsor: User } type SponsorshipConnection { - edges: [SponsorshipEdge] + edges: [SponsorshipEdge] - nodes: [Sponsorship] + nodes: [Sponsorship] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type SponsorshipEdge { - cursor: String! + cursor: String! - node: Sponsorship + node: Sponsorship } input SponsorshipOrder { - direction: OrderDirection! + direction: OrderDirection! } enum SponsorshipPrivacy { - PRIVATE + PRIVATE - PUBLIC + PUBLIC } input StarOrder { - direction: OrderDirection! + direction: OrderDirection! - field: StarOrderField! + field: StarOrderField! } enum StarOrderField { - STARRED_AT + STARRED_AT } type StargazerConnection { - edges: [StargazerEdge] + edges: [StargazerEdge] - nodes: [User] + nodes: [User] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type StargazerEdge { - cursor: String! - node: User! + cursor: String! + node: User! - starredAt: DateTime! + starredAt: DateTime! } interface Starrable { - id: ID! + id: ID! - stargazers( - after: String + stargazers( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: StarOrder - ): StargazerConnection! + orderBy: StarOrder + ): StargazerConnection! - viewerHasStarred: Boolean! + viewerHasStarred: Boolean! } type StarredRepositoryConnection { - edges: [StarredRepositoryEdge] + edges: [StarredRepositoryEdge] - nodes: [Repository] + nodes: [Repository] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type StarredRepositoryEdge { - cursor: String! - node: Repository! + cursor: String! + node: Repository! - starredAt: DateTime! + starredAt: DateTime! } type Status implements Node { - commit: Commit + commit: Commit - context( - name: String! - ): StatusContext + context( + name: String! + ): StatusContext - contexts: [StatusContext!]! - id: ID! + contexts: [StatusContext!]! + id: ID! - state: StatusState! + state: StatusState! } type StatusContext implements Node { - avatarUrl( - size: Int = 40 - ): URI + avatarUrl( + size: Int = 40 + ): URI - commit: Commit + commit: Commit - context: String! + context: String! - createdAt: DateTime! + createdAt: DateTime! - creator: Actor + creator: Actor - description: String - id: ID! + description: String + id: ID! - state: StatusState! + state: StatusState! - targetUrl: URI + targetUrl: URI } enum StatusState { - ERROR + ERROR - EXPECTED + EXPECTED - FAILURE + FAILURE - PENDING + PENDING - SUCCESS + SUCCESS } input SubmitPullRequestReviewInput { - body: String + body: String - clientMutationId: String + clientMutationId: String - event: PullRequestReviewEvent! + event: PullRequestReviewEvent! - pullRequestReviewId: ID! + pullRequestReviewId: ID! } type SubmitPullRequestReviewPayload { - clientMutationId: String + clientMutationId: String - pullRequestReview: PullRequestReview + pullRequestReview: PullRequestReview } interface Subscribable { - id: ID! + id: ID! - viewerCanSubscribe: Boolean! + viewerCanSubscribe: Boolean! - viewerSubscription: SubscriptionState + viewerSubscription: SubscriptionState } type SubscribedEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - subscribable: Subscribable! + subscribable: Subscribable! } enum SubscriptionState { - IGNORED + IGNORED - SUBSCRIBED + SUBSCRIBED - UNSUBSCRIBED + UNSUBSCRIBED } type SuggestedReviewer { - isAuthor: Boolean! + isAuthor: Boolean! - isCommenter: Boolean! + isCommenter: Boolean! - reviewer: User! + reviewer: User! } type Tag implements GitObject & Node { - abbreviatedOid: String! + abbreviatedOid: String! - commitResourcePath: URI! + commitResourcePath: URI! - commitUrl: URI! - id: ID! + commitUrl: URI! + id: ID! - message: String + message: String - name: String! + name: String! - oid: GitObjectID! + oid: GitObjectID! - repository: Repository! + repository: Repository! - tagger: GitActor + tagger: GitActor - target: GitObject! + target: GitObject! } type Team implements MemberStatusable & Node & Subscribable { - ancestors( - after: String + ancestors( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): TeamConnection! + last: Int + ): TeamConnection! - avatarUrl( - size: Int = 400 - ): URI + avatarUrl( + size: Int = 400 + ): URI - childTeams( - after: String + childTeams( + after: String - before: String + before: String - first: Int + first: Int - immediateOnly: Boolean = true + immediateOnly: Boolean = true - last: Int + last: Int - orderBy: TeamOrder + orderBy: TeamOrder - userLogins: [String!] - ): TeamConnection! + userLogins: [String!] + ): TeamConnection! - combinedSlug: String! + combinedSlug: String! - createdAt: DateTime! + createdAt: DateTime! - description: String + description: String - editTeamResourcePath: URI! + editTeamResourcePath: URI! - editTeamUrl: URI! - id: ID! + editTeamUrl: URI! + id: ID! - invitations( - after: String + invitations( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): OrganizationInvitationConnection + last: Int + ): OrganizationInvitationConnection - memberStatuses( - after: String + memberStatuses( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: UserStatusOrder = {field: UPDATED_AT, direction: DESC} - ): UserStatusConnection! + orderBy: UserStatusOrder = {field: UPDATED_AT, direction: DESC} + ): UserStatusConnection! - members( - after: String + members( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - membership: TeamMembershipType = ALL + membership: TeamMembershipType = ALL - orderBy: TeamMemberOrder + orderBy: TeamMemberOrder - query: String + query: String - role: TeamMemberRole - ): TeamMemberConnection! + role: TeamMemberRole + ): TeamMemberConnection! - membersResourcePath: URI! + membersResourcePath: URI! - membersUrl: URI! + membersUrl: URI! - name: String! + name: String! - newTeamResourcePath: URI! + newTeamResourcePath: URI! - newTeamUrl: URI! + newTeamUrl: URI! - organization: Organization! + organization: Organization! - parentTeam: Team + parentTeam: Team - privacy: TeamPrivacy! + privacy: TeamPrivacy! - repositories( - after: String + repositories( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: TeamRepositoryOrder + orderBy: TeamRepositoryOrder - query: String - ): TeamRepositoryConnection! + query: String + ): TeamRepositoryConnection! - repositoriesResourcePath: URI! + repositoriesResourcePath: URI! - repositoriesUrl: URI! + repositoriesUrl: URI! - resourcePath: URI! + resourcePath: URI! - slug: String! + slug: String! - teamsResourcePath: URI! + teamsResourcePath: URI! - teamsUrl: URI! + teamsUrl: URI! - updatedAt: DateTime! + updatedAt: DateTime! - url: URI! + url: URI! - viewerCanAdminister: Boolean! + viewerCanAdminister: Boolean! - viewerCanSubscribe: Boolean! + viewerCanSubscribe: Boolean! - viewerSubscription: SubscriptionState + viewerSubscription: SubscriptionState } type TeamConnection { - edges: [TeamEdge] + edges: [TeamEdge] - nodes: [Team] + nodes: [Team] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type TeamEdge { - cursor: String! + cursor: String! - node: Team + node: Team } type TeamMemberConnection { - edges: [TeamMemberEdge] + edges: [TeamMemberEdge] - nodes: [User] + nodes: [User] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type TeamMemberEdge { - cursor: String! + cursor: String! - memberAccessResourcePath: URI! + memberAccessResourcePath: URI! - memberAccessUrl: URI! - node: User! + memberAccessUrl: URI! + node: User! - role: TeamMemberRole! + role: TeamMemberRole! } input TeamMemberOrder { - direction: OrderDirection! + direction: OrderDirection! - field: TeamMemberOrderField! + field: TeamMemberOrderField! } enum TeamMemberOrderField { - CREATED_AT + CREATED_AT - LOGIN + LOGIN } enum TeamMemberRole { - MAINTAINER + MAINTAINER - MEMBER + MEMBER } enum TeamMembershipType { - ALL + ALL - CHILD_TEAM + CHILD_TEAM - IMMEDIATE + IMMEDIATE } input TeamOrder { - direction: OrderDirection! + direction: OrderDirection! - field: TeamOrderField! + field: TeamOrderField! } enum TeamOrderField { - NAME + NAME } enum TeamPrivacy { - SECRET + SECRET - VISIBLE + VISIBLE } type TeamRepositoryConnection { - edges: [TeamRepositoryEdge] + edges: [TeamRepositoryEdge] - nodes: [Repository] + nodes: [Repository] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type TeamRepositoryEdge { - cursor: String! - node: Repository! + cursor: String! + node: Repository! - permission: RepositoryPermission! + permission: RepositoryPermission! } input TeamRepositoryOrder { - direction: OrderDirection! + direction: OrderDirection! - field: TeamRepositoryOrderField! + field: TeamRepositoryOrderField! } enum TeamRepositoryOrderField { - CREATED_AT + CREATED_AT - NAME + NAME - PERMISSION + PERMISSION - PUSHED_AT + PUSHED_AT - STARGAZERS + STARGAZERS - UPDATED_AT + UPDATED_AT } enum TeamRole { - ADMIN + ADMIN - MEMBER + MEMBER } type TextMatch { - fragment: String! + fragment: String! - highlights: [TextMatchHighlight!]! + highlights: [TextMatchHighlight!]! - property: String! + property: String! } type TextMatchHighlight { - beginIndice: Int! + beginIndice: Int! - endIndice: Int! + endIndice: Int! - text: String! + text: String! } type Topic implements Node & Starrable { - id: ID! + id: ID! - name: String! + name: String! - relatedTopics( - first: Int = 3 - ): [Topic!]! + relatedTopics( + first: Int = 3 + ): [Topic!]! - stargazers( - after: String + stargazers( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: StarOrder - ): StargazerConnection! + orderBy: StarOrder + ): StargazerConnection! - viewerHasStarred: Boolean! + viewerHasStarred: Boolean! } type TopicConnection { - edges: [TopicEdge] + edges: [TopicEdge] - nodes: [Topic] + nodes: [Topic] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type TopicEdge { - cursor: String! + cursor: String! - node: Topic + node: Topic } enum TopicSuggestionDeclineReason { - NOT_RELEVANT + NOT_RELEVANT - PERSONAL_PREFERENCE + PERSONAL_PREFERENCE - TOO_GENERAL + TOO_GENERAL - TOO_SPECIFIC + TOO_SPECIFIC } type TransferredEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! + createdAt: DateTime! - fromRepository: Repository - id: ID! + fromRepository: Repository + id: ID! - issue: Issue! + issue: Issue! } type Tree implements GitObject & Node { - abbreviatedOid: String! + abbreviatedOid: String! - commitResourcePath: URI! + commitResourcePath: URI! - commitUrl: URI! + commitUrl: URI! - entries: [TreeEntry!] - id: ID! + entries: [TreeEntry!] + id: ID! - oid: GitObjectID! + oid: GitObjectID! - repository: Repository! + repository: Repository! } type TreeEntry { - mode: Int! + mode: Int! - name: String! + name: String! - object: GitObject + object: GitObject - oid: GitObjectID! + oid: GitObjectID! - repository: Repository! + repository: Repository! - type: String! + type: String! } scalar URI type UnassignedEvent implements Node { - actor: Actor + actor: Actor - assignable: Assignable! + assignable: Assignable! - assignee: Assignee + assignee: Assignee - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - user: User @deprecated(reason: "Assignees can now be mannequins. Use the `assignee` field instead. Removal on 2020-01-01 UTC.") + user: User @deprecated(reason: "Assignees can now be mannequins. Use the `assignee` field instead. Removal on 2020-01-01 UTC.") } interface UniformResourceLocatable { - resourcePath: URI! + resourcePath: URI! - url: URI! + url: URI! } type UnknownSignature implements GitSignature { - email: String! + email: String! - isValid: Boolean! + isValid: Boolean! - payload: String! + payload: String! - signature: String! + signature: String! - signer: User + signer: User - state: GitSignatureState! + state: GitSignatureState! - wasSignedByGitHub: Boolean! + wasSignedByGitHub: Boolean! } type UnlabeledEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - label: Label! + label: Label! - labelable: Labelable! + labelable: Labelable! } input UnlinkRepositoryFromProjectInput { - clientMutationId: String + clientMutationId: String - projectId: ID! + projectId: ID! - repositoryId: ID! + repositoryId: ID! } type UnlinkRepositoryFromProjectPayload { - clientMutationId: String + clientMutationId: String - project: Project + project: Project - repository: Repository + repository: Repository } input UnlockLockableInput { - clientMutationId: String + clientMutationId: String - lockableId: ID! + lockableId: ID! } type UnlockLockablePayload { - clientMutationId: String + clientMutationId: String - unlockedRecord: Lockable + unlockedRecord: Lockable } type UnlockedEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - lockable: Lockable! + lockable: Lockable! } input UnmarkIssueAsDuplicateInput { - canonicalId: ID! + canonicalId: ID! - clientMutationId: String + clientMutationId: String - duplicateId: ID! + duplicateId: ID! } type UnmarkIssueAsDuplicatePayload { - clientMutationId: String + clientMutationId: String - duplicate: IssueOrPullRequest + duplicate: IssueOrPullRequest } input UnminimizeCommentInput { - clientMutationId: String + clientMutationId: String - subjectId: ID! + subjectId: ID! } input UnpinIssueInput { - clientMutationId: String + clientMutationId: String - issueId: ID! + issueId: ID! } type UnpinnedEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - issue: Issue! + issue: Issue! } input UnresolveReviewThreadInput { - clientMutationId: String + clientMutationId: String - threadId: ID! + threadId: ID! } type UnresolveReviewThreadPayload { - clientMutationId: String + clientMutationId: String - thread: PullRequestReviewThread + thread: PullRequestReviewThread } type UnsubscribedEvent implements Node { - actor: Actor + actor: Actor - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - subscribable: Subscribable! + subscribable: Subscribable! } interface Updatable { - viewerCanUpdate: Boolean! + viewerCanUpdate: Boolean! } interface UpdatableComment { - viewerCannotUpdateReasons: [CommentCannotUpdateReason!]! + viewerCannotUpdateReasons: [CommentCannotUpdateReason!]! } input UpdateBranchProtectionRuleInput { - branchProtectionRuleId: ID! + branchProtectionRuleId: ID! - clientMutationId: String + clientMutationId: String - dismissesStaleReviews: Boolean + dismissesStaleReviews: Boolean - isAdminEnforced: Boolean + isAdminEnforced: Boolean - pattern: String + pattern: String - pushActorIds: [ID!] + pushActorIds: [ID!] - requiredApprovingReviewCount: Int + requiredApprovingReviewCount: Int - requiredStatusCheckContexts: [String!] + requiredStatusCheckContexts: [String!] - requiresApprovingReviews: Boolean + requiresApprovingReviews: Boolean - requiresCodeOwnerReviews: Boolean + requiresCodeOwnerReviews: Boolean - requiresCommitSignatures: Boolean + requiresCommitSignatures: Boolean - requiresStatusChecks: Boolean + requiresStatusChecks: Boolean - requiresStrictStatusChecks: Boolean + requiresStrictStatusChecks: Boolean - restrictsPushes: Boolean + restrictsPushes: Boolean - restrictsReviewDismissals: Boolean + restrictsReviewDismissals: Boolean - reviewDismissalActorIds: [ID!] + reviewDismissalActorIds: [ID!] } type UpdateBranchProtectionRulePayload { - branchProtectionRule: BranchProtectionRule + branchProtectionRule: BranchProtectionRule - clientMutationId: String + clientMutationId: String } input UpdateIssueCommentInput { - body: String! + body: String! - clientMutationId: String + clientMutationId: String - id: ID! + id: ID! } type UpdateIssueCommentPayload { - clientMutationId: String + clientMutationId: String - issueComment: IssueComment + issueComment: IssueComment } input UpdateIssueInput { - assigneeIds: [ID!] + assigneeIds: [ID!] - body: String + body: String - clientMutationId: String + clientMutationId: String - id: ID! + id: ID! - labelIds: [ID!] + labelIds: [ID!] - milestoneId: ID + milestoneId: ID - projectIds: [ID!] + projectIds: [ID!] - state: IssueState + state: IssueState - title: String + title: String } type UpdateIssuePayload { - clientMutationId: String + clientMutationId: String - issue: Issue + issue: Issue } input UpdateProjectCardInput { - clientMutationId: String + clientMutationId: String - isArchived: Boolean + isArchived: Boolean - note: String + note: String - projectCardId: ID! + projectCardId: ID! } type UpdateProjectCardPayload { - clientMutationId: String + clientMutationId: String - projectCard: ProjectCard + projectCard: ProjectCard } input UpdateProjectColumnInput { - clientMutationId: String + clientMutationId: String - name: String! + name: String! - projectColumnId: ID! + projectColumnId: ID! } type UpdateProjectColumnPayload { - clientMutationId: String + clientMutationId: String - projectColumn: ProjectColumn + projectColumn: ProjectColumn } input UpdateProjectInput { - body: String + body: String - clientMutationId: String + clientMutationId: String - name: String + name: String - projectId: ID! + projectId: ID! - public: Boolean + public: Boolean - state: ProjectState + state: ProjectState } type UpdateProjectPayload { - clientMutationId: String + clientMutationId: String - project: Project + project: Project } input UpdatePullRequestInput { - baseRefName: String + baseRefName: String - body: String + body: String - clientMutationId: String + clientMutationId: String - maintainerCanModify: Boolean + maintainerCanModify: Boolean - pullRequestId: ID! + pullRequestId: ID! - title: String + title: String } type UpdatePullRequestPayload { - clientMutationId: String + clientMutationId: String - pullRequest: PullRequest + pullRequest: PullRequest } input UpdatePullRequestReviewCommentInput { - body: String! + body: String! - clientMutationId: String + clientMutationId: String - pullRequestReviewCommentId: ID! + pullRequestReviewCommentId: ID! } type UpdatePullRequestReviewCommentPayload { - clientMutationId: String + clientMutationId: String - pullRequestReviewComment: PullRequestReviewComment + pullRequestReviewComment: PullRequestReviewComment } input UpdatePullRequestReviewInput { - body: String! + body: String! - clientMutationId: String + clientMutationId: String - pullRequestReviewId: ID! + pullRequestReviewId: ID! } type UpdatePullRequestReviewPayload { - clientMutationId: String + clientMutationId: String - pullRequestReview: PullRequestReview + pullRequestReview: PullRequestReview } input UpdateRefInput { - clientMutationId: String + clientMutationId: String - force: Boolean = false + force: Boolean = false - oid: GitObjectID! + oid: GitObjectID! - refId: ID! + refId: ID! } type UpdateRefPayload { - clientMutationId: String + clientMutationId: String - ref: Ref + ref: Ref } input UpdateRepositoryInput { - clientMutationId: String + clientMutationId: String - description: String + description: String - hasIssuesEnabled: Boolean + hasIssuesEnabled: Boolean - hasProjectsEnabled: Boolean + hasProjectsEnabled: Boolean - hasWikiEnabled: Boolean + hasWikiEnabled: Boolean - homepageUrl: URI + homepageUrl: URI - name: String + name: String - repositoryId: ID! + repositoryId: ID! - template: Boolean + template: Boolean } type UpdateRepositoryPayload { - clientMutationId: String + clientMutationId: String - repository: Repository + repository: Repository } input UpdateSubscriptionInput { - clientMutationId: String + clientMutationId: String - state: SubscriptionState! + state: SubscriptionState! - subscribableId: ID! + subscribableId: ID! } type UpdateSubscriptionPayload { - clientMutationId: String + clientMutationId: String - subscribable: Subscribable + subscribable: Subscribable } input UpdateTopicsInput { - clientMutationId: String + clientMutationId: String - repositoryId: ID! + repositoryId: ID! - topicNames: [String!]! + topicNames: [String!]! } type UpdateTopicsPayload { - clientMutationId: String + clientMutationId: String - invalidTopicNames: [String!] + invalidTopicNames: [String!] - repository: Repository + repository: Repository } type User implements Actor & Node & ProfileOwner & ProjectOwner & RegistryPackageOwner & RegistryPackageSearch & RepositoryOwner & Sponsorable & UniformResourceLocatable { - anyPinnableItems( - type: PinnableItemType - ): Boolean! + anyPinnableItems( + type: PinnableItemType + ): Boolean! - avatarUrl( - size: Int - ): URI! + avatarUrl( + size: Int + ): URI! - bio: String + bio: String - bioHTML: HTML! + bioHTML: HTML! - commitComments( - after: String + commitComments( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): CommitCommentConnection! + last: Int + ): CommitCommentConnection! - company: String + company: String - companyHTML: HTML! + companyHTML: HTML! - contributionsCollection( - from: DateTime + contributionsCollection( + from: DateTime - organizationID: ID + organizationID: ID - to: DateTime - ): ContributionsCollection! + to: DateTime + ): ContributionsCollection! - createdAt: DateTime! + createdAt: DateTime! - databaseId: Int + databaseId: Int - email: String! + email: String! - followers( - after: String + followers( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): FollowerConnection! + last: Int + ): FollowerConnection! - following( - after: String + following( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): FollowingConnection! + last: Int + ): FollowingConnection! - gist( - name: String! - ): Gist + gist( + name: String! + ): Gist - gistComments( - after: String + gistComments( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): GistCommentConnection! + last: Int + ): GistCommentConnection! - gists( - after: String + gists( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: GistOrder + orderBy: GistOrder - privacy: GistPrivacy - ): GistConnection! - id: ID! + privacy: GistPrivacy + ): GistConnection! + id: ID! - isBountyHunter: Boolean! + isBountyHunter: Boolean! - isCampusExpert: Boolean! + isCampusExpert: Boolean! - isDeveloperProgramMember: Boolean! + isDeveloperProgramMember: Boolean! - isEmployee: Boolean! + isEmployee: Boolean! - isHireable: Boolean! + isHireable: Boolean! - isSiteAdmin: Boolean! + isSiteAdmin: Boolean! - isViewer: Boolean! + isViewer: Boolean! - issueComments( - after: String + issueComments( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): IssueCommentConnection! + last: Int + ): IssueCommentConnection! - issues( - after: String + issues( + after: String - before: String + before: String - filterBy: IssueFilters + filterBy: IssueFilters - first: Int + first: Int - labels: [String!] + labels: [String!] - last: Int + last: Int - orderBy: IssueOrder + orderBy: IssueOrder - states: [IssueState!] - ): IssueConnection! + states: [IssueState!] + ): IssueConnection! - itemShowcase: ProfileItemShowcase! + itemShowcase: ProfileItemShowcase! - location: String + location: String - login: String! + login: String! - name: String + name: String - organization( - login: String! - ): Organization + organization( + login: String! + ): Organization - organizations( - after: String + organizations( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): OrganizationConnection! + last: Int + ): OrganizationConnection! - pinnableItems( - after: String + pinnableItems( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - types: [PinnableItemType!] - ): PinnableItemConnection! + types: [PinnableItemType!] + ): PinnableItemConnection! - pinnedItems( - after: String + pinnedItems( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - types: [PinnableItemType!] - ): PinnableItemConnection! + types: [PinnableItemType!] + ): PinnableItemConnection! - pinnedItemsRemaining: Int! + pinnedItemsRemaining: Int! - pinnedRepositories( - affiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] + pinnedRepositories( + affiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] - after: String + after: String - before: String + before: String - first: Int + first: Int - isLocked: Boolean + isLocked: Boolean - last: Int + last: Int - orderBy: RepositoryOrder + orderBy: RepositoryOrder - ownerAffiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] + ownerAffiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] - privacy: RepositoryPrivacy - ): RepositoryConnection! @deprecated(reason: "pinnedRepositories will be removed Use ProfileOwner.pinnedItems instead. Removal on 2019-10-01 UTC.") + privacy: RepositoryPrivacy + ): RepositoryConnection! @deprecated(reason: "pinnedRepositories will be removed Use ProfileOwner.pinnedItems instead. Removal on 2019-10-01 UTC.") - project( - number: Int! - ): Project + project( + number: Int! + ): Project - projects( - after: String + projects( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: ProjectOrder + orderBy: ProjectOrder - search: String + search: String - states: [ProjectState!] - ): ProjectConnection! + states: [ProjectState!] + ): ProjectConnection! - projectsResourcePath: URI! + projectsResourcePath: URI! - projectsUrl: URI! + projectsUrl: URI! - publicKeys( - after: String + publicKeys( + after: String - before: String + before: String - first: Int + first: Int - last: Int - ): PublicKeyConnection! + last: Int + ): PublicKeyConnection! - pullRequests( - after: String + pullRequests( + after: String - baseRefName: String + baseRefName: String - before: String + before: String - first: Int + first: Int - headRefName: String + headRefName: String - labels: [String!] + labels: [String!] - last: Int + last: Int - orderBy: IssueOrder + orderBy: IssueOrder - states: [PullRequestState!] - ): PullRequestConnection! + states: [PullRequestState!] + ): PullRequestConnection! - registryPackages( - after: String + registryPackages( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - name: String + name: String - names: [String] + names: [String] - packageType: RegistryPackageType + packageType: RegistryPackageType - publicOnly: Boolean = false + publicOnly: Boolean = false - registryPackageType: String + registryPackageType: String - repositoryId: ID - ): RegistryPackageConnection! + repositoryId: ID + ): RegistryPackageConnection! - registryPackagesForQuery( - after: String + registryPackagesForQuery( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - packageType: RegistryPackageType + packageType: RegistryPackageType - query: String - ): RegistryPackageConnection! + query: String + ): RegistryPackageConnection! - repositories( - affiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] + repositories( + affiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] - after: String + after: String - before: String + before: String - first: Int + first: Int - isFork: Boolean + isFork: Boolean - isLocked: Boolean + isLocked: Boolean - last: Int + last: Int - orderBy: RepositoryOrder + orderBy: RepositoryOrder - ownerAffiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] + ownerAffiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] - privacy: RepositoryPrivacy - ): RepositoryConnection! + privacy: RepositoryPrivacy + ): RepositoryConnection! - repositoriesContributedTo( - after: String + repositoriesContributedTo( + after: String - before: String + before: String - contributionTypes: [RepositoryContributionType] + contributionTypes: [RepositoryContributionType] - first: Int + first: Int - includeUserRepositories: Boolean + includeUserRepositories: Boolean - isLocked: Boolean + isLocked: Boolean - last: Int + last: Int - orderBy: RepositoryOrder + orderBy: RepositoryOrder - privacy: RepositoryPrivacy - ): RepositoryConnection! + privacy: RepositoryPrivacy + ): RepositoryConnection! - repository( - name: String! - ): Repository + repository( + name: String! + ): Repository - resourcePath: URI! + resourcePath: URI! - savedReplies( - after: String + savedReplies( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: SavedReplyOrder = {field: UPDATED_AT, direction: DESC} - ): SavedReplyConnection + orderBy: SavedReplyOrder = {field: UPDATED_AT, direction: DESC} + ): SavedReplyConnection - sponsorshipsAsMaintainer( - after: String + sponsorshipsAsMaintainer( + after: String - before: String + before: String - first: Int + first: Int - includePrivate: Boolean = false + includePrivate: Boolean = false - last: Int + last: Int - orderBy: SponsorshipOrder - ): SponsorshipConnection! + orderBy: SponsorshipOrder + ): SponsorshipConnection! - sponsorshipsAsSponsor( - after: String + sponsorshipsAsSponsor( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: SponsorshipOrder - ): SponsorshipConnection! + orderBy: SponsorshipOrder + ): SponsorshipConnection! - starredRepositories( - after: String + starredRepositories( + after: String - before: String + before: String - first: Int + first: Int - last: Int + last: Int - orderBy: StarOrder + orderBy: StarOrder - ownedByViewer: Boolean - ): StarredRepositoryConnection! + ownedByViewer: Boolean + ): StarredRepositoryConnection! - status: UserStatus + status: UserStatus - updatedAt: DateTime! + updatedAt: DateTime! - url: URI! + url: URI! - viewerCanChangePinnedItems: Boolean! + viewerCanChangePinnedItems: Boolean! - viewerCanCreateProjects: Boolean! + viewerCanCreateProjects: Boolean! - viewerCanFollow: Boolean! + viewerCanFollow: Boolean! - viewerIsFollowing: Boolean! + viewerIsFollowing: Boolean! - watching( - affiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR, ORGANIZATION_MEMBER] + watching( + affiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR, ORGANIZATION_MEMBER] - after: String + after: String - before: String + before: String - first: Int + first: Int - isLocked: Boolean + isLocked: Boolean - last: Int + last: Int - orderBy: RepositoryOrder + orderBy: RepositoryOrder - ownerAffiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] + ownerAffiliations: [RepositoryAffiliation] = [OWNER, COLLABORATOR] - privacy: RepositoryPrivacy - ): RepositoryConnection! + privacy: RepositoryPrivacy + ): RepositoryConnection! - websiteUrl: URI + websiteUrl: URI } enum UserBlockDuration { - ONE_DAY + ONE_DAY - ONE_MONTH + ONE_MONTH - ONE_WEEK + ONE_WEEK - PERMANENT + PERMANENT - THREE_DAYS + THREE_DAYS } type UserBlockedEvent implements Node { - actor: Actor + actor: Actor - blockDuration: UserBlockDuration! + blockDuration: UserBlockDuration! - createdAt: DateTime! - id: ID! + createdAt: DateTime! + id: ID! - subject: User + subject: User } type UserConnection { - edges: [UserEdge] + edges: [UserEdge] - nodes: [User] + nodes: [User] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type UserContentEdit implements Node { - createdAt: DateTime! + createdAt: DateTime! - deletedAt: DateTime + deletedAt: DateTime - deletedBy: Actor + deletedBy: Actor - diff: String + diff: String - editedAt: DateTime! + editedAt: DateTime! - editor: Actor - id: ID! + editor: Actor + id: ID! - updatedAt: DateTime! + updatedAt: DateTime! } type UserContentEditConnection { - edges: [UserContentEditEdge] + edges: [UserContentEditEdge] - nodes: [UserContentEdit] + nodes: [UserContentEdit] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type UserContentEditEdge { - cursor: String! + cursor: String! - node: UserContentEdit + node: UserContentEdit } type UserEdge { - cursor: String! + cursor: String! - node: User + node: User } type UserStatus implements Node { - createdAt: DateTime! + createdAt: DateTime! - emoji: String + emoji: String - emojiHTML: HTML + emojiHTML: HTML - expiresAt: DateTime + expiresAt: DateTime - id: ID! + id: ID! - indicatesLimitedAvailability: Boolean! + indicatesLimitedAvailability: Boolean! - message: String + message: String - organization: Organization + organization: Organization - updatedAt: DateTime! + updatedAt: DateTime! - user: User! + user: User! } type UserStatusConnection { - edges: [UserStatusEdge] + edges: [UserStatusEdge] - nodes: [UserStatus] + nodes: [UserStatus] - pageInfo: PageInfo! + pageInfo: PageInfo! - totalCount: Int! + totalCount: Int! } type UserStatusEdge { - cursor: String! + cursor: String! - node: UserStatus + node: UserStatus } input UserStatusOrder { - direction: OrderDirection! + direction: OrderDirection! - field: UserStatusOrderField! + field: UserStatusOrderField! } enum UserStatusOrderField { - UPDATED_AT + UPDATED_AT } scalar X509Certificate \ No newline at end of file diff --git a/src/test/resources/schemas/type-interface-duplicate-fields.graphqls b/src/test/resources/schemas/type-interface-duplicate-fields.graphqls index 4925e1f4d..bb906b920 100644 --- a/src/test/resources/schemas/type-interface-duplicate-fields.graphqls +++ b/src/test/resources/schemas/type-interface-duplicate-fields.graphqls @@ -1,11 +1,11 @@ interface NamedEntity { - # an awesome name! - name: String @deprecated + # an awesome name! + name: String @deprecated } type Person implements NamedEntity { - name: String + name: String - # age in years - age: Int + # age in years + age: Int } \ No newline at end of file diff --git a/src/test/resources/schemas/type-interface-duplicate-fields1.graphqls b/src/test/resources/schemas/type-interface-duplicate-fields1.graphqls index dae7002a5..bb33af850 100644 --- a/src/test/resources/schemas/type-interface-duplicate-fields1.graphqls +++ b/src/test/resources/schemas/type-interface-duplicate-fields1.graphqls @@ -1,11 +1,11 @@ interface NamedEntity { - name: String @shouldnotbehere + name: String @shouldnotbehere } type Person implements NamedEntity { - # an awesome name! - name: String @deprecated + # an awesome name! + name: String @deprecated - # age in years - age: Int + # age in years + age: Int } \ No newline at end of file