Automattic\WooCommerce\Vendor\GraphQL\Utils

BreakingChangesFinder::findFieldsThatChangedTypeOnInputObjectTypespublic staticWC 1.0

Method of the class: BreakingChangesFinder{}

No Hooks.

Returns

Changes.

Usage

$result = BreakingChangesFinder::findFieldsThatChangedTypeOnInputObjectTypes( $oldSchema, $newSchema ): array;
$oldSchema(Schema) (required)
.
$newSchema(Schema) (required)
.

BreakingChangesFinder::findFieldsThatChangedTypeOnInputObjectTypes() code WC 10.9.1

public static function findFieldsThatChangedTypeOnInputObjectTypes(
    Schema $oldSchema,
    Schema $newSchema
): array {
    $oldTypeMap = $oldSchema->getTypeMap();
    $newTypeMap = $newSchema->getTypeMap();

    $breakingChanges = [];
    $dangerousChanges = [];
    foreach ($oldTypeMap as $typeName => $oldType) {
        $newType = $newTypeMap[$typeName] ?? null;
        if (! ($oldType instanceof InputObjectType) || ! ($newType instanceof InputObjectType)) {
            continue;
        }

        $oldTypeFieldsDef = $oldType->getFields();
        $newTypeFieldsDef = $newType->getFields();
        foreach (array_keys($oldTypeFieldsDef) as $fieldName) {
            if (! isset($newTypeFieldsDef[$fieldName])) {
                $breakingChanges[] = [
                    'type' => self::BREAKING_CHANGE_FIELD_REMOVED,
                    'description' => "{$typeName}.{$fieldName} was removed.",
                ];
            } else {
                $oldFieldType = $oldTypeFieldsDef[$fieldName]->getType();
                $newFieldType = $newTypeFieldsDef[$fieldName]->getType();

                $isSafe = self::isChangeSafeForInputObjectFieldOrFieldArg(
                    $oldFieldType,
                    $newFieldType
                );
                if (! $isSafe) {
                    $oldFieldTypeString = $oldFieldType instanceof NamedType
                        ? $oldFieldType->name
                        : $oldFieldType;
                    $newFieldTypeString = $newFieldType instanceof NamedType
                        ? $newFieldType->name
                        : $newFieldType;

                    $breakingChanges[] = [
                        'type' => self::BREAKING_CHANGE_FIELD_CHANGED_KIND,
                        'description' => "{$typeName}.{$fieldName} changed type from {$oldFieldTypeString} to {$newFieldTypeString}.",
                    ];
                }
            }
        }

        // Check if a field was added to the input object type
        foreach ($newTypeFieldsDef as $fieldName => $fieldDef) {
            if (isset($oldTypeFieldsDef[$fieldName])) {
                continue;
            }

            $newTypeName = $newType->name;
            if ($fieldDef->isRequired()) {
                $breakingChanges[] = [
                    'type' => self::BREAKING_CHANGE_REQUIRED_INPUT_FIELD_ADDED,
                    'description' => "A required field {$fieldName} on input type {$newTypeName} was added.",
                ];
            } else {
                $dangerousChanges[] = [
                    'type' => self::DANGEROUS_CHANGE_OPTIONAL_INPUT_FIELD_ADDED,
                    'description' => "An optional field {$fieldName} on input type {$newTypeName} was added.",
                ];
            }
        }
    }

    return [
        'breakingChanges' => $breakingChanges,
        'dangerousChanges' => $dangerousChanges,
    ];
}