diff --git a/src/GraphQL/IndexByDirectiveSchemaExtender.php b/src/GraphQL/IndexByDirectiveSchemaExtender.php new file mode 100644 index 0000000..6cd2a5a --- /dev/null +++ b/src/GraphQL/IndexByDirectiveSchemaExtender.php @@ -0,0 +1,52 @@ +getDirective('indexBy'); + + if ($existing !== null) { + Assert::eq($existing->locations, ['FIELD'], 'Expected @indexBy to be on FIELD'); + Assert::count($existing->args, 1, 'Expected @indexBy to have 1 argument'); + + [$field] = $existing->args; + Assert::eq($field->name, 'field', 'Expected @indexBy argument to be named "field"'); + Assert::eq(Type::nonNull(Type::string()), $field->getType(), 'Expected @indexBy argument to be a non-null string'); + + return $schema; + } + + return SchemaExtender::extend( + $schema, + Parser::parse( + <<<'GRAPHQL' + directive @indexBy(field: String!) on FIELD + GRAPHQL, + ), + ); + } +} diff --git a/src/SchemaLoader.php b/src/SchemaLoader.php index b51f5fc..e5003f0 100644 --- a/src/SchemaLoader.php +++ b/src/SchemaLoader.php @@ -5,11 +5,9 @@ namespace Ruudk\GraphQLCodeGenerator; use Exception; -use GraphQL\Language\Parser; use GraphQL\Type\Schema; use GraphQL\Utils\BuildClientSchema; use GraphQL\Utils\BuildSchema; -use GraphQL\Utils\SchemaExtender; use JsonException; use Symfony\Component\Filesystem\Filesystem; use Webmozart\Assert\Assert; @@ -50,14 +48,7 @@ public function load(Schema | string $schema, bool $indexByDirective) : Schema Assert::isInstanceOf($schema, Schema::class, 'Invalid schema given, expected .graphql or .json file or Schema instance'); if ($indexByDirective) { - $schema = SchemaExtender::extend( - $schema, - Parser::parse( - <<<'GRAPHQL' - directive @indexBy(field: String!) on FIELD - GRAPHQL - ), - ); + $schema = GraphQL\IndexByDirectiveSchemaExtender::extend($schema); } return $schema;