Automattic\WooCommerce\Vendor\GraphQL\Utils
BreakingChangesFinder::findFieldsThatChangedTypeOnInputObjectTypes
Method of the class: BreakingChangesFinder{}
No Hooks.
Returns
Changes.
Usage
$result = BreakingChangesFinder::findFieldsThatChangedTypeOnInputObjectTypes( $oldSchema, $newSchema ): array;
BreakingChangesFinder::findFieldsThatChangedTypeOnInputObjectTypes() 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,
];
}