diff --git a/src/Utils/SchemaExtender.php b/src/Utils/SchemaExtender.php index 8a3155c55..9c2ee1dec 100644 --- a/src/Utils/SchemaExtender.php +++ b/src/Utils/SchemaExtender.php @@ -519,6 +519,7 @@ protected function extendFieldMap(Type $type): array $field = $oldFieldMap[$fieldName]; $newFieldMap[$fieldName] = [ + ...$field->config, 'name' => $fieldName, 'description' => $field->description, 'deprecationReason' => $field->deprecationReason, diff --git a/tests/Utils/SchemaExtenderTest.php b/tests/Utils/SchemaExtenderTest.php index 26b9cc44b..6df4e80d6 100644 --- a/tests/Utils/SchemaExtenderTest.php +++ b/tests/Utils/SchemaExtenderTest.php @@ -11,7 +11,10 @@ use GraphQL\Language\AST\DocumentNode; use GraphQL\Language\AST\FieldDefinitionNode; use GraphQL\Language\AST\IntValueNode; +use GraphQL\Language\AST\Node; use GraphQL\Language\AST\NodeList; +use GraphQL\Language\AST\ObjectTypeDefinitionNode; +use GraphQL\Language\AST\ObjectTypeExtensionNode; use GraphQL\Language\AST\SchemaDefinitionNode; use GraphQL\Language\Parser; use GraphQL\Language\Printer; @@ -1731,7 +1734,8 @@ public function testOriginalResolversArePreserved(): void $helloResolveFn = $extendedQueryType->getField('hello')->resolveFn; self::assertIsCallable($helloResolveFn); - $query = /** @lang GraphQL */ '{ hello }'; + $query /** @lang GraphQL */ + = '{ hello }'; $result = GraphQL::executeQuery($extendedSchema, $query); self::assertSame(['data' => ['hello' => $value]], $result->toArray()); } @@ -1767,7 +1771,8 @@ public function testOriginalResolveFieldIsPreserved(): void $queryResolveFieldFn = $extendedQueryType->resolveFieldFn; self::assertIsCallable($queryResolveFieldFn); - $query = /** @lang GraphQL */ '{ hello }'; + $query /** @lang GraphQL */ + = '{ hello }'; $result = GraphQL::executeQuery($extendedSchema, $query); self::assertSame(['data' => ['hello' => $value]], $result->toArray()); } @@ -1775,7 +1780,8 @@ public function testOriginalResolveFieldIsPreserved(): void /** @see https://github.com/webonyx/graphql-php/issues/180 */ public function testShouldBeAbleToIntroduceNewTypesThroughExtension(): void { - $sdl = /** @lang GraphQL */ ' + $sdl /** @lang GraphQL */ + = ' type Query { defaultValue: String } @@ -1788,7 +1794,8 @@ public function testShouldBeAbleToIntroduceNewTypesThroughExtension(): void $documentNode = Parser::parse($sdl); $schema = BuildSchema::build($documentNode); - $extensionSdl = /** @lang GraphQL */ ' + $extensionSdl /** @lang GraphQL */ + = ' type Bar { foo: Foo } @@ -1836,6 +1843,39 @@ public function testPreservesRepeatableInDirective(): void self::assertTrue($extendedDirective->isRepeatable); } + public function testCustomConfigIsTransferred(): void + { + $fieldConfigDecorator = function ( + array $typeConfig, + FieldDefinitionNode $fieldDefinitionNode, + Node $node + ) { + if (($node instanceof ObjectTypeDefinitionNode || $node instanceof ObjectTypeExtensionNode) && $node->name->value === 'Test' && ($fieldDefinitionNode->name->value === 'field1' || $fieldDefinitionNode->name->value === 'field2')) { + $typeConfig['customAttr'] = true; + } + + return $typeConfig; + }; + $schema = BuildSchema::build(/** @lang GraphQL */ ' + type Test { + field1: String! + } + ', null, [], $fieldConfigDecorator); + + $type = $schema->getType('Test'); + assert($type instanceof ObjectType); + $field1 = $type->getField('field1'); + self::assertArrayHasKey('customAttr', $field1->config); + + $extendedSchema = SchemaExtender::extend($schema, Parser::parse(/** @lang GraphQL */ 'extend type Test { field2: String! }'), [], null, $fieldConfigDecorator); + $type = $extendedSchema->getType('Test'); + assert($type instanceof ObjectType); + $field1 = $type->getField('field1'); + self::assertArrayHasKey('customAttr', $field1->config); + $field2 = $type->getField('field2'); + self::assertArrayHasKey('customAttr', $field2->config); + } + public function testSupportsTypeConfigDecorator(): void { $helloValue = 'Hello World!'; @@ -1886,7 +1926,8 @@ public function testSupportsTypeConfigDecorator(): void $extendedSchema = SchemaExtender::extend($schema, $documentNode, [], $typeConfigDecorator, $fieldConfigDecorator); - $query = /** @lang GraphQL */ ' + $query /** @lang GraphQL */ + = ' { hello foo { @@ -1994,7 +2035,8 @@ public function testPreservesResolveTypeMethod(): void $SomeInterfaceClassType->concrete = $ExtendedFooType; $SomeUnionClassType->concrete = $ExtendedFooType; - $query = /** @lang GraphQL */ ' + $query /** @lang GraphQL */ + = ' { someUnion { __typename @@ -2052,7 +2094,8 @@ public function testPreservesIsTypeOfMethod(): void $extendedSchema = SchemaExtender::extend($schema, $documentNode); - $query = /** @lang GraphQL */ ' + $query /** @lang GraphQL */ + = ' { someInterface { __typename