finish mechanical conversions

This commit is contained in:
Ben Roberts 2017-11-16 17:42:38 -05:00
parent a1325eeb3f
commit af60f1ee4d

View File

@ -245,61 +245,41 @@ class FindBreakingChanges
} }
/** /**
* @param $oldSchema * @param Schema $oldSchema
* @param $newSchema * @param Schema $newSchema
* *
* @return array * @return array
*/ */
private static function findFieldsThatChangedTypeOnObjectOrInterfaceTypes( private static function findFieldsThatChangedTypeOnObjectOrInterfaceTypes(Schema $oldSchema, Schema $newSchema)
$oldSchema, $newSchema
)
{ {
/*const oldTypeMap = oldSchema.getTypeMap(); $oldTypeMap = $oldSchema->getTypeMap();
const newTypeMap = newSchema.getTypeMap(); $newTypeMap = $newSchema->getTypeMap();
const breakingFieldChanges = []; $breakingFieldChanges = [];
Object.keys(oldTypeMap).forEach(typeName => { foreach ($oldTypeMap as $typeName => $oldType) {
const oldType = oldTypeMap[typeName]; $newType = isset($newTypeMap[$typeName]) ? $newTypeMap[$typeName] : null;
const newType = newTypeMap[typeName]; if (!($oldType instanceof ObjectType || $oldType instanceof InterfaceType) || !($newType instanceof $oldType)) {
if ( continue;
!(oldType instanceof GraphQLObjectType ||
oldType instanceof GraphQLInterfaceType) ||
!(newType instanceof oldType.constructor)
) {
return;
} }
$oldTypeFieldsDef = $oldType->getFields();
const oldTypeFieldsDef = oldType.getFields(); $newTypeFieldsDef = $newType->getFields();
const newTypeFieldsDef = newType.getFields(); foreach ($oldTypeFieldsDef as $fieldName => $fieldDefinition) {
Object.keys(oldTypeFieldsDef).forEach(fieldName => { if (!isset($newTypeFieldsDef[$fieldName])) {
// Check if the field is missing on the type in the new schema. $breakingFieldChanges[] = ['type' => self::BREAKING_CHANGE_FIELD_REMOVED, 'description' => "${typeName}->${fieldName} was removed."];
if (!(fieldName in newTypeFieldsDef)) {
breakingFieldChanges.push({
type: BreakingChangeType.FIELD_REMOVED,
description: `${typeName}.${fieldName} was removed.`,
});
} else { } else {
const oldFieldType = oldTypeFieldsDef[fieldName].type; $oldFieldType = $oldTypeFieldsDef[$fieldName]->getType();
const newFieldType = newTypeFieldsDef[fieldName].type; $newfieldType = $newTypeFieldsDef[$fieldName]->getType();
const isSafe = $isSafe = self::isChangeSafeForObjectOrInterfaceField($oldFieldType, $newfieldType);
isChangeSafeForObjectOrInterfaceField(oldFieldType, newFieldType); if (!$isSafe) {
if (!isSafe) {
const oldFieldTypeString = isNamedType(oldFieldType) ? $oldFieldTypeString = self::isNamedType($oldFieldType) ? $oldFieldType->name : $oldFieldType;
oldFieldType.name : $newFieldTypeString = self::isNamedType($newfieldType) ? $newfieldType->name : $newfieldType;
oldFieldType.toString(); $breakingFieldChanges[] = ['type' => self::BREAKING_CHANGE_FIELD_CHANGED, 'description' => "${typeName}->${fieldName} changed type from ${oldFieldTypeString} to ${newFieldTypeString}"];
const newFieldTypeString = isNamedType(newFieldType) ?
newFieldType.name :
newFieldType.toString();
breakingFieldChanges.push({
type: BreakingChangeType.FIELD_CHANGED_KIND,
description: `${typeName}.${fieldName} changed type from ` +
`${oldFieldTypeString} to ${newFieldTypeString}.`,
});
} }
} }
}); }
}); }
return breakingFieldChanges;*/ return $breakingFieldChanges;
} }
/** /**
@ -312,65 +292,40 @@ class FindBreakingChanges
Schema $oldSchema, Schema $newSchema Schema $oldSchema, Schema $newSchema
) )
{ {
/* const oldTypeMap = oldSchema.getTypeMap(); $oldTypeMap = $oldSchema->getTypeMap();
const newTypeMap = newSchema.getTypeMap(); $newTypeMap = $newSchema->getTypeMap();
const breakingFieldChanges = []; $breakingFieldChanges = [];
Object.keys(oldTypeMap).forEach(typeName => { foreach ($oldTypeMap as $typeName => $oldType) {
const oldType = oldTypeMap[typeName]; $newType = isset($newTypeMap[$typeName]) ? $newTypeMap[$typeName] : null;
const newType = newTypeMap[typeName]; if (!($oldType instanceof InputObjectType) || !($newType instanceof InputObjectType)) {
if ( continue;
!(oldType instanceof GraphQLInputObjectType) ||
!(newType instanceof GraphQLInputObjectType)
) {
return;
} }
$oldTypeFieldsDef = $oldType->getFields();
const oldTypeFieldsDef = oldType.getFields(); $newTypeFieldsDef = $newType->getFields();
const newTypeFieldsDef = newType.getFields(); foreach ($oldTypeFieldsDef as $fieldName => $fieldDefinition) {
Object.keys(oldTypeFieldsDef).forEach(fieldName => { if (!isset($newTypeFieldsDef[$fieldName])) {
// Check if the field is missing on the type in the new schema. $breakingFieldChanges[] = ['type' => self::BREAKING_CHANGE_FIELD_REMOVED, 'description' => "${typeName}->${fieldName} was removed."];
if (!(fieldName in newTypeFieldsDef)) {
breakingFieldChanges.push({
type: BreakingChangeType.FIELD_REMOVED,
description: `${typeName}.${fieldName} was removed.`,
});
} else { } else {
const oldFieldType = oldTypeFieldsDef[fieldName].type; $oldFieldType = $oldTypeFieldsDef[$fieldName]->getType();
const newFieldType = newTypeFieldsDef[fieldName].type; $newfieldType = $newTypeFieldsDef[$fieldName]->getType();
$isSafe = self::isChangeSafeForInputObjectFieldOrFieldArg($oldFieldType, $newfieldType);
if (!$isSafe) {
$oldFieldTypeString = self::isNamedType($oldFieldType) ? $oldFieldType->name : $oldFieldType;
$newFieldTypeString = self::isNamedType($newfieldType) ? $newfieldType->name : $newfieldType;
$breakingFieldChanges[] = ['type' => self::BREAKING_CHANGE_FIELD_CHANGED, 'description' => "${typeName}->${fieldName} changed type from ${oldFieldTypeString} to ${newFieldTypeString}"];
}
}
}
foreach ($newTypeFieldsDef as $fieldName => $fieldDef) {
if (!isset($oldTypeFieldsDef[$fieldName]) && $fieldDef->getType() instanceof NonNull) {
$newTypeName = $newType->name;
$breakingFieldChanges[] = ['type' => self::BREAKING_CHANGE_NON_NULL_INPUT_FIELD_ADDED, 'description' => "A non-null field ${fieldName} on input type ${$newTypeName} was added"];
}
}
}
return $breakingFieldChanges;
const isSafe =
isChangeSafeForInputObjectFieldOrFieldArg(oldFieldType, newFieldType);
if (!isSafe) {
const oldFieldTypeString = isNamedType(oldFieldType) ?
oldFieldType.name :
oldFieldType.toString();
const newFieldTypeString = isNamedType(newFieldType) ?
newFieldType.name :
newFieldType.toString();
breakingFieldChanges.push({
type: BreakingChangeType.FIELD_CHANGED_KIND,
description: `${typeName}.${fieldName} changed type from ` +
`${oldFieldTypeString} to ${newFieldTypeString}.`,
});
}
}
});
// Check if a non-null field was added to the input object type
Object.keys(newTypeFieldsDef).forEach(fieldName => {
if (
!(fieldName in oldTypeFieldsDef) &&
newTypeFieldsDef[fieldName].type instanceof GraphQLNonNull
) {
breakingFieldChanges.push({
type: BreakingChangeType.NON_NULL_INPUT_FIELD_ADDED,
description: `A non-null field ${fieldName} on ` +
`input type ${newType.name} was added.`,
});
}
});
});
return breakingFieldChanges;*/
} }
private static function isChangeSafeForObjectOrInterfaceField( private static function isChangeSafeForObjectOrInterfaceField(