diff --git a/src/Validator/Rules/KnownTypeNames.php b/src/Validator/Rules/KnownTypeNames.php index 36670ae18..663a71249 100644 --- a/src/Validator/Rules/KnownTypeNames.php +++ b/src/Validator/Rules/KnownTypeNames.php @@ -16,7 +16,6 @@ use GraphQL\Validator\SDLValidationContext; use GraphQL\Validator\ValidationContext; -use function array_key_exists; use function array_keys; use function count; use function in_array; @@ -46,32 +45,28 @@ public function getSDLVisitor(SDLValidationContext $context): array */ private function getVisitorInternal($context): array { - $schema = $context->getSchema(); - $existingTypesMap = $schema !== null - ? $schema->getTypeMap() - : []; - - /** @var array $definedTypes */ + /** @var array $definedTypes */ $definedTypes = []; foreach ($context->getDocument()->definitions as $def) { if (! ($def instanceof TypeDefinitionNode)) { continue; } - $definedTypes[$def->name->value] = true; + $definedTypes[] = $def->name->value; } - $typeNames = [ - ...array_keys($existingTypesMap), - ...array_keys($definedTypes), - ]; - $standardTypeNames = array_keys(Type::getAllBuiltInTypes()); return [ - NodeKind::NAMED_TYPE => static function (NamedTypeNode $node, $_1, $parent, $_2, $ancestors) use ($context, $existingTypesMap, $definedTypes, $typeNames, $standardTypeNames): void { + NodeKind::NAMED_TYPE => static function (NamedTypeNode $node, $_1, $parent, $_2, $ancestors) use ($context, $definedTypes, $standardTypeNames): void { $typeName = $node->name->value; - if (array_key_exists($typeName, $existingTypesMap) || array_key_exists($typeName, $definedTypes)) { + $schema = $context->getSchema(); + + if (in_array($typeName, $definedTypes, true)) { + return; + } + + if ($schema !== null && $schema->hasType($typeName)) { return; } @@ -81,6 +76,13 @@ private function getVisitorInternal($context): array return; } + $existingTypesMap = $schema !== null + ? $schema->getTypeMap() + : []; + $typeNames = [ + ...array_keys($existingTypesMap), + ...$definedTypes, + ]; $context->reportError(new Error( static::unknownTypeMessage( $typeName, diff --git a/tests/Validator/KnownTypeNamesTest.php b/tests/Validator/KnownTypeNamesTest.php index c9d6a4ace..772275c0a 100644 --- a/tests/Validator/KnownTypeNamesTest.php +++ b/tests/Validator/KnownTypeNamesTest.php @@ -76,6 +76,7 @@ public function testUnknownTypeNamesAreInvalid(): void */ public function testReferencesToStandardScalarsThatAreMissingInSchema(): void { + self::markTestSkipped('TODO we differ from graphql-js due to lazy loading, see https://github.com/webonyx/graphql-php/issues/964#issuecomment-945969162'); $schema = BuildSchema::build('type Query { foo: String }'); $query = ' query ($id: ID, $float: Float, $int: Int) {