Skip to content

Commit b65fa34

Browse files
authored
Add suport for @disableErrorPropagation (#6414)
* add suport for @disableErrorPropagation * Condition enabling @disableErrorPropagation on @catchByDefault
1 parent 4472a68 commit b65fa34

File tree

6 files changed

+27
-4
lines changed

6 files changed

+27
-4
lines changed

Diff for: libraries/apollo-ast/src/commonMain/kotlin/com/apollographql/apollo/ast/Schema.kt

+2
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,8 @@ class Schema internal constructor(
203203
const val ONE_OF = "oneOf"
204204
@ApolloExperimental
205205
const val DEFER = "defer"
206+
@ApolloExperimental
207+
const val DISABLE_ERROR_PROPAGATION = "experimental_disableErrorPropagation"
206208

207209
@ApolloExperimental
208210
const val LINK = "link"

Diff for: libraries/apollo-ast/src/commonMain/kotlin/com/apollographql/apollo/ast/gqldocument.kt

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import com.apollographql.apollo.annotations.ApolloInternal
66
import com.apollographql.apollo.ast.internal.ExtensionsMerger
77
import com.apollographql.apollo.ast.internal.builtinsDefinitionsStr
88
import com.apollographql.apollo.ast.internal.compilerOptions_0_0
9+
import com.apollographql.apollo.ast.internal.disableErrorPropagationStr
910
import com.apollographql.apollo.ast.internal.kotlinLabsDefinitions_0_3
1011
import com.apollographql.apollo.ast.internal.kotlinLabsDefinitions_0_4
1112
import com.apollographql.apollo.ast.internal.kotlinLabsDefinitions_0_5

Diff for: libraries/apollo-ast/src/commonMain/kotlin/com/apollographql/apollo/ast/internal/SchemaValidationScope.kt

+2-1
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,8 @@ internal fun validateSchema(definitions: List<GQLDefinition>, options: SchemaVal
261261
deferDefinitionsStr,
262262
nonNullDefinitionStr,
263263
kotlinLabsDefinitions_0_5,
264-
nullabilityDefinitionsStr
264+
nullabilityDefinitionsStr,
265+
disableErrorPropagationStr
265266
).flatMap {
266267
it.parseAsGQLDocument().getOrThrow().definitions
267268
}

Diff for: libraries/apollo-ast/src/commonMain/kotlin/com/apollographql/apollo/ast/internal/definitions.kt

+6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.apollographql.apollo.ast.internal
22

3+
import com.apollographql.apollo.annotations.ApolloInternal
4+
35
/**
46
* This file contains several groups of GraphQL definitions we use during codegen:
57
*
@@ -544,4 +546,8 @@ directive @defer(
544546

545547
internal val nonNullDefinitionStr = """
546548
directive @nonnull(fields: String! = "") on OBJECT | FIELD
549+
""".trimIndent()
550+
551+
internal val disableErrorPropagationStr = """
552+
directive @experimental_disableErrorPropagation on QUERY | MUTATION | SUBSCRIPTION
547553
""".trimIndent()

Diff for: libraries/apollo-compiler/src/main/kotlin/com/apollographql/apollo/compiler/ApolloCompiler.kt

+13-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import com.apollographql.apollo.ast.DifferentShape
55
import com.apollographql.apollo.ast.DirectiveRedefinition
66
import com.apollographql.apollo.ast.ForeignSchema
77
import com.apollographql.apollo.ast.GQLDefinition
8+
import com.apollographql.apollo.ast.GQLDirective
89
import com.apollographql.apollo.ast.GQLDocument
910
import com.apollographql.apollo.ast.GQLFragmentDefinition
1011
import com.apollographql.apollo.ast.GQLOperationDefinition
@@ -14,6 +15,7 @@ import com.apollographql.apollo.ast.IncompatibleDefinition
1415
import com.apollographql.apollo.ast.Issue
1516
import com.apollographql.apollo.ast.ParserOptions
1617
import com.apollographql.apollo.ast.QueryDocumentMinifier
18+
import com.apollographql.apollo.ast.Schema
1719
import com.apollographql.apollo.ast.UnknownDirective
1820
import com.apollographql.apollo.ast.UnusedFragment
1921
import com.apollographql.apollo.ast.UnusedVariable
@@ -269,10 +271,19 @@ object ApolloCompiler {
269271
}
270272
}
271273

274+
272275
val operations = definitions.filterIsInstance<GQLOperationDefinition>().map {
273-
addRequiredFields(it, addTypename, schema, fragmentDefinitions).let {
274-
documentTransform?.transform(schema, it) ?: it
276+
var operation = addRequiredFields(it, addTypename, schema, fragmentDefinitions)
277+
if (documentTransform != null) {
278+
operation = documentTransform.transform(schema, it)
279+
}
280+
if (schema.directiveDefinitions.containsKey(Schema.DISABLE_ERROR_PROPAGATION)
281+
&& schema.schemaDefinition?.directives?.any { schema.originalDirectiveName(it.name) == Schema.CATCH_BY_DEFAULT } == true) {
282+
operation = operation.copy(
283+
directives = operation.directives + GQLDirective(null, Schema.DISABLE_ERROR_PROPAGATION, emptyList())
284+
)
275285
}
286+
operation
276287
}
277288

278289
// Remember the fragments with the possibly updated fragments

Diff for: tests/catch/src/main/graphql/shared/schema.graphqls

+3-1
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,6 @@ type User {
2020

2121
type Product {
2222
price: String
23-
}
23+
}
24+
25+
directive @experimental_disableErrorPropagation on QUERY | MUTATION | SUBSCRIPTION

0 commit comments

Comments
 (0)