Automattic\WooCommerce\Vendor\GraphQL\Validator\Rules

KnownArgumentNamesOnDirectives::getASTVisitorpublicWC 1.0

Method of the class: KnownArgumentNamesOnDirectives{}

No Hooks.

Returns

null. Nothing (null).

Usage

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

KnownArgumentNamesOnDirectives::getASTVisitor() code WC 10.9.1

public function getASTVisitor(ValidationContext $context): array
{
    $directiveArgs = [];
    $schema = $context->getSchema();
    $definedDirectives = $schema !== null
        ? $schema->getDirectives()
        : Directive::getInternalDirectives();

    foreach ($definedDirectives as $directive) {
        $directiveArgs[$directive->name] = array_map(
            static fn (Argument $arg): string => $arg->name,
            $directive->args
        );
    }

    $astDefinitions = $context->getDocument()->definitions;
    foreach ($astDefinitions as $def) {
        if ($def instanceof DirectiveDefinitionNode) {
            $argNames = [];
            foreach ($def->arguments as $arg) {
                $argNames[] = $arg->name->value;
            }

            $directiveArgs[$def->name->value] = $argNames;
        }
    }

    return [
        NodeKind::DIRECTIVE => static function (DirectiveNode $directiveNode) use ($directiveArgs, $context): VisitorOperation {
            $directiveName = $directiveNode->name->value;

            if (! isset($directiveArgs[$directiveName])) {
                return Visitor::skipNode();
            }
            $knownArgs = $directiveArgs[$directiveName];

            foreach ($directiveNode->arguments as $argNode) {
                $argName = $argNode->name->value;
                if (! in_array($argName, $knownArgs, true)) {
                    $suggestions = Utils::suggestionList($argName, $knownArgs);
                    $context->reportError(new Error(
                        static::unknownDirectiveArgMessage($argName, $directiveName, $suggestions),
                        [$argNode]
                    ));
                }
            }

            return Visitor::skipNode();
        },
    ];
}