Automattic\WooCommerce\Vendor\GraphQL\Utils

BuildSchema::buildSchemapublicWC 1.0

Method of the class: BuildSchema{}

No Hooks.

Returns

null. Nothing (null).

Usage

$BuildSchema = new BuildSchema();
$BuildSchema->buildSchema(): Schema;

BuildSchema::buildSchema() code WC 10.9.1

public function buildSchema(): Schema
{
    if (
        ! ($this->options['assumeValid'] ?? false)
        && ! ($this->options['assumeValidSDL'] ?? false)
    ) {
        DocumentValidator::assertValidSDL($this->ast);
    }

    $schemaDef = null;

    /** @var array<string, Node&TypeDefinitionNode> */
    $typeDefinitionsMap = [];

    /** @var array<string, array<int, Node&TypeExtensionNode>> $typeExtensionsMap */
    $typeExtensionsMap = [];

    /** @var array<int, DirectiveDefinitionNode> $directiveDefs */
    $directiveDefs = [];

    foreach ($this->ast->definitions as $definition) {
        switch (true) {
            case $definition instanceof SchemaDefinitionNode:
                $schemaDef = $definition;
                break;
            case $definition instanceof TypeDefinitionNode:
                $name = $definition->getName()->value;
                $typeDefinitionsMap[$name] = $definition;
                break;
            case $definition instanceof TypeExtensionNode:
                $name = $definition->getName()->value;
                $typeExtensionsMap[$name][] = $definition;
                break;
            case $definition instanceof DirectiveDefinitionNode:
                $directiveDefs[] = $definition;
                break;
        }
    }

    $operationTypes = $schemaDef !== null
        ? $this->getOperationTypes($schemaDef)
        : [
            'query' => 'Query',
            'mutation' => 'Mutation',
            'subscription' => 'Subscription',
        ];

    $definitionBuilder = new ASTDefinitionBuilder(
        $typeDefinitionsMap,
        $typeExtensionsMap,
        static function (string $typeName): Type {
            throw self::unknownType($typeName);
        },
        $this->typeConfigDecorator,
        $this->fieldConfigDecorator
    );

    $directives = array_map(
        [$definitionBuilder, 'buildDirective'],
        $directiveDefs
    );

    $directivesByName = [];
    foreach ($directives as $directive) {
        $directivesByName[$directive->name][] = $directive;
    }

    // If specified directives were not explicitly declared, add them.
    if (! isset($directivesByName['include'])) {
        $directives[] = Directive::includeDirective();
    }
    if (! isset($directivesByName['skip'])) {
        $directives[] = Directive::skipDirective();
    }
    if (! isset($directivesByName['deprecated'])) {
        $directives[] = Directive::deprecatedDirective();
    }
    if (! isset($directivesByName['oneOf'])) {
        $directives[] = Directive::oneOfDirective();
    }

    // Note: While this could make early assertions to get the correctly
    // typed values below, that would throw immediately while type system
    // validation with validateSchema() will produce more actionable results.
    return new Schema(
        (new SchemaConfig())
            ->setDescription($schemaDef->description->value ?? null)
        // @phpstan-ignore-next-line
            ->setQuery(isset($operationTypes['query'])
                ? $definitionBuilder->maybeBuildType($operationTypes['query'])
                : null)
        // @phpstan-ignore-next-line
            ->setMutation(isset($operationTypes['mutation'])
                ? $definitionBuilder->maybeBuildType($operationTypes['mutation'])
                : null)
        // @phpstan-ignore-next-line
            ->setSubscription(isset($operationTypes['subscription'])
                ? $definitionBuilder->maybeBuildType($operationTypes['subscription'])
                : null)
            ->setTypeLoader(static fn (string $name): ?Type => $definitionBuilder->maybeBuildType($name))
            ->setDirectives($directives)
            ->setAstNode($schemaDef)
            ->setTypes(fn (): array => array_map(
                static fn (TypeDefinitionNode $def): Type => $definitionBuilder->buildType($def->getName()->value),
                $typeDefinitionsMap,
            ))
    );
}