Automattic\WooCommerce\Vendor\GraphQL\Validator\Rules

UniqueDirectivesPerLocation::getASTVisitorpublicWC 1.0

Method of the class: UniqueDirectivesPerLocation{}

No Hooks.

Returns

null. Nothing (null).

Usage

$UniqueDirectivesPerLocation = new UniqueDirectivesPerLocation();
$UniqueDirectivesPerLocation->getASTVisitor( $context ): array;
$context(ValidationContext) (required)
.

UniqueDirectivesPerLocation::getASTVisitor() code WC 10.9.1

public function getASTVisitor(ValidationContext $context): array
{
    /** @var array<string, true> $uniqueDirectiveMap */
    $uniqueDirectiveMap = [];

    $schema = $context->getSchema();
    $definedDirectives = $schema !== null
        ? $schema->getDirectives()
        : Directive::getInternalDirectives();
    foreach ($definedDirectives as $directive) {
        if (! $directive->isRepeatable) {
            $uniqueDirectiveMap[$directive->name] = true;
        }
    }

    $astDefinitions = $context->getDocument()->definitions;
    foreach ($astDefinitions as $definition) {
        if ($definition instanceof DirectiveDefinitionNode
            && ! $definition->repeatable
        ) {
            $uniqueDirectiveMap[$definition->name->value] = true;
        }
    }

    return [
        'enter' => static function (Node $node) use ($uniqueDirectiveMap, $context): void {
            if (! property_exists($node, 'directives')) {
                return;
            }

            $knownDirectives = [];

            foreach ($node->directives as $directive) {
                $directiveName = $directive->name->value;

                if (isset($uniqueDirectiveMap[$directiveName])) {
                    if (isset($knownDirectives[$directiveName])) {
                        $context->reportError(new Error(
                            static::duplicateDirectiveMessage($directiveName),
                            [$knownDirectives[$directiveName], $directive]
                        ));
                    } else {
                        $knownDirectives[$directiveName] = $directive;
                    }
                }
            }
        },
    ];
}