Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add suport for @disableErrorPropagation #6414

Merged
merged 2 commits into from
Mar 7, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,8 @@ class Schema internal constructor(
const val ONE_OF = "oneOf"
@ApolloExperimental
const val DEFER = "defer"
@ApolloExperimental
const val DISABLE_ERROR_PROPAGATION = "experimental_disableErrorPropagation"

@ApolloExperimental
const val LINK = "link"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import com.apollographql.apollo.annotations.ApolloInternal
import com.apollographql.apollo.ast.internal.ExtensionsMerger
import com.apollographql.apollo.ast.internal.builtinsDefinitionsStr
import com.apollographql.apollo.ast.internal.compilerOptions_0_0
import com.apollographql.apollo.ast.internal.disableErrorPropagationStr
import com.apollographql.apollo.ast.internal.kotlinLabsDefinitions_0_3
import com.apollographql.apollo.ast.internal.kotlinLabsDefinitions_0_4
import com.apollographql.apollo.ast.internal.kotlinLabsDefinitions_0_5
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -261,7 +261,8 @@ internal fun validateSchema(definitions: List<GQLDefinition>, options: SchemaVal
deferDefinitionsStr,
nonNullDefinitionStr,
kotlinLabsDefinitions_0_5,
nullabilityDefinitionsStr
nullabilityDefinitionsStr,
disableErrorPropagationStr
).flatMap {
it.parseAsGQLDocument().getOrThrow().definitions
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.apollographql.apollo.ast.internal

import com.apollographql.apollo.annotations.ApolloInternal

/**
* This file contains several groups of GraphQL definitions we use during codegen:
*
Expand Down Expand Up @@ -544,4 +546,8 @@ directive @defer(

internal val nonNullDefinitionStr = """
directive @nonnull(fields: String! = "") on OBJECT | FIELD
""".trimIndent()

internal val disableErrorPropagationStr = """
directive @experimental_disableErrorPropagation on QUERY | MUTATION | SUBSCRIPTION
""".trimIndent()
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import com.apollographql.apollo.ast.DifferentShape
import com.apollographql.apollo.ast.DirectiveRedefinition
import com.apollographql.apollo.ast.ForeignSchema
import com.apollographql.apollo.ast.GQLDefinition
import com.apollographql.apollo.ast.GQLDirective
import com.apollographql.apollo.ast.GQLDocument
import com.apollographql.apollo.ast.GQLFragmentDefinition
import com.apollographql.apollo.ast.GQLOperationDefinition
Expand All @@ -14,6 +15,7 @@ import com.apollographql.apollo.ast.IncompatibleDefinition
import com.apollographql.apollo.ast.Issue
import com.apollographql.apollo.ast.ParserOptions
import com.apollographql.apollo.ast.QueryDocumentMinifier
import com.apollographql.apollo.ast.Schema
import com.apollographql.apollo.ast.UnknownDirective
import com.apollographql.apollo.ast.UnusedFragment
import com.apollographql.apollo.ast.UnusedVariable
Expand Down Expand Up @@ -269,10 +271,19 @@ object ApolloCompiler {
}
}


val operations = definitions.filterIsInstance<GQLOperationDefinition>().map {
addRequiredFields(it, addTypename, schema, fragmentDefinitions).let {
documentTransform?.transform(schema, it) ?: it
var operation = addRequiredFields(it, addTypename, schema, fragmentDefinitions)
if (documentTransform != null) {
operation = documentTransform.transform(schema, it)
}
if (schema.directiveDefinitions.containsKey(Schema.DISABLE_ERROR_PROPAGATION)
&& schema.schemaDefinition?.directives?.any { schema.originalDirectiveName(it.name) == Schema.CATCH_BY_DEFAULT } == true) {
operation = operation.copy(
directives = operation.directives + GQLDirective(null, Schema.DISABLE_ERROR_PROPAGATION, emptyList())
)
}
operation
}

// Remember the fragments with the possibly updated fragments
Expand Down
4 changes: 3 additions & 1 deletion tests/catch/src/main/graphql/shared/schema.graphqls
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,6 @@ type User {

type Product {
price: String
}
}

directive @experimental_disableErrorPropagation on QUERY | MUTATION | SUBSCRIPTION
Loading