Pedantic fixes
This commit is contained in:
parent
cf4b96da42
commit
77eb28f49c
7 changed files with 84 additions and 72 deletions
|
@ -23,11 +23,11 @@ void main() {
|
|||
'todos',
|
||||
listOf(todoType),
|
||||
resolve: (_, __) => [
|
||||
Todo(
|
||||
text: 'Clean your room!',
|
||||
completed: false,
|
||||
)
|
||||
],
|
||||
Todo(
|
||||
text: 'Clean your room!',
|
||||
completed: false,
|
||||
)
|
||||
],
|
||||
),
|
||||
]),
|
||||
);
|
||||
|
|
|
@ -45,10 +45,12 @@ class GraphQL {
|
|||
}
|
||||
|
||||
if (_schema.queryType != null) this.customTypes.add(_schema.queryType);
|
||||
if (_schema.mutationType != null)
|
||||
if (_schema.mutationType != null) {
|
||||
this.customTypes.add(_schema.mutationType);
|
||||
if (_schema.subscriptionType != null)
|
||||
}
|
||||
if (_schema.subscriptionType != null) {
|
||||
this.customTypes.add(_schema.subscriptionType);
|
||||
}
|
||||
}
|
||||
|
||||
GraphQLType convertType(TypeContext ctx) {
|
||||
|
@ -115,10 +117,10 @@ class GraphQL {
|
|||
var operation = getOperation(document, operationName);
|
||||
var coercedVariableValues = coerceVariableValues(
|
||||
schema, operation, variableValues ?? <String, dynamic>{});
|
||||
if (operation.isQuery)
|
||||
if (operation.isQuery) {
|
||||
return await executeQuery(document, operation, schema,
|
||||
coercedVariableValues, initialValue, globalVariables);
|
||||
else if (operation.isSubscription) {
|
||||
} else if (operation.isSubscription) {
|
||||
return await subscribe(document, operation, schema, coercedVariableValues,
|
||||
globalVariables, initialValue);
|
||||
} else {
|
||||
|
@ -129,20 +131,17 @@ class GraphQL {
|
|||
|
||||
OperationDefinitionContext getOperation(
|
||||
DocumentContext document, String operationName) {
|
||||
var ops =
|
||||
document.definitions.where((d) => d is OperationDefinitionContext);
|
||||
var ops = document.definitions.whereType<OperationDefinitionContext>();
|
||||
|
||||
if (operationName == null) {
|
||||
return ops.length == 1
|
||||
? ops.first as OperationDefinitionContext
|
||||
? ops.first
|
||||
: throw GraphQLException.fromMessage(
|
||||
'This document does not define any operations.');
|
||||
} else {
|
||||
return ops.firstWhere(
|
||||
(d) => (d as OperationDefinitionContext).name == operationName,
|
||||
orElse: () => throw GraphQLException.fromMessage(
|
||||
'Missing required operation "$operationName".'))
|
||||
as OperationDefinitionContext;
|
||||
return ops.firstWhere((d) => d.name == operationName,
|
||||
orElse: () => throw GraphQLException.fromMessage(
|
||||
'Missing required operation "$operationName".'));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -241,15 +240,17 @@ class GraphQL {
|
|||
initialValue) {
|
||||
var selectionSet = subscription.selectionSet;
|
||||
var subscriptionType = schema.subscriptionType;
|
||||
if (subscriptionType == null)
|
||||
if (subscriptionType == null) {
|
||||
throw GraphQLException.fromSourceSpan(
|
||||
'The schema does not define a subscription type.', subscription.span);
|
||||
}
|
||||
var groupedFieldSet =
|
||||
collectFields(document, subscriptionType, selectionSet, variableValues);
|
||||
if (groupedFieldSet.length != 1)
|
||||
if (groupedFieldSet.length != 1) {
|
||||
throw GraphQLException.fromSourceSpan(
|
||||
'The grouped field set from this query must have exactly one entry.',
|
||||
selectionSet.span);
|
||||
}
|
||||
var fields = groupedFieldSet.entries.first.value;
|
||||
var fieldName = fields.first.field.fieldName.alias?.name ??
|
||||
fields.first.field.fieldName.name;
|
||||
|
@ -284,10 +285,10 @@ class GraphQL {
|
|||
Map<String, dynamic> globalVariables) async {
|
||||
var selectionSet = subscription.selectionSet;
|
||||
var subscriptionType = schema.subscriptionType;
|
||||
if (subscriptionType == null)
|
||||
if (subscriptionType == null) {
|
||||
throw GraphQLException.fromSourceSpan(
|
||||
'The schema does not define a subscription type.', subscription.span);
|
||||
|
||||
}
|
||||
try {
|
||||
var data = await executeSelectionSet(document, selectionSet,
|
||||
subscriptionType, initialValue, variableValues, globalVariables);
|
||||
|
@ -309,10 +310,11 @@ class GraphQL {
|
|||
});
|
||||
var resolver = field.resolve;
|
||||
var result = await resolver(rootValue, argumentValues);
|
||||
if (result is Stream)
|
||||
if (result is Stream) {
|
||||
return result;
|
||||
else
|
||||
} else {
|
||||
return Stream.fromIterable([result]);
|
||||
}
|
||||
}
|
||||
|
||||
Future<Map<String, dynamic>> executeSelectionSet(
|
||||
|
@ -348,8 +350,7 @@ class GraphQL {
|
|||
objectValue,
|
||||
fields,
|
||||
fieldType,
|
||||
Map<String, dynamic>.from(
|
||||
globalVariables ?? <String, dynamic>{})
|
||||
Map<String, dynamic>.from(globalVariables ?? <String, dynamic>{})
|
||||
..addAll(variableValues),
|
||||
globalVariables);
|
||||
}
|
||||
|
@ -490,9 +491,10 @@ class GraphQL {
|
|||
if (objectValue is Map) {
|
||||
return objectValue[fieldName] as T;
|
||||
} else if (field.resolve == null) {
|
||||
if (defaultFieldResolver != null)
|
||||
if (defaultFieldResolver != null) {
|
||||
return await defaultFieldResolver(
|
||||
objectValue, fieldName, argumentValues);
|
||||
}
|
||||
|
||||
return null;
|
||||
} else {
|
||||
|
@ -601,17 +603,14 @@ class GraphQL {
|
|||
return t;
|
||||
}
|
||||
|
||||
errors
|
||||
.addAll(validation.errors.map((m) => GraphQLExceptionError(m)));
|
||||
errors.addAll(validation.errors.map((m) => GraphQLExceptionError(m)));
|
||||
} on GraphQLException catch (e) {
|
||||
errors.addAll(e.errors);
|
||||
}
|
||||
}
|
||||
|
||||
errors.insert(
|
||||
0,
|
||||
GraphQLExceptionError(
|
||||
'Cannot convert value $result to type $type.'));
|
||||
errors.insert(0,
|
||||
GraphQLExceptionError('Cannot convert value $result to type $type.'));
|
||||
|
||||
throw GraphQLException(errors);
|
||||
}
|
||||
|
@ -640,10 +639,13 @@ class GraphQL {
|
|||
visitedFragments ??= [];
|
||||
|
||||
for (var selection in selectionSet.selections) {
|
||||
if (getDirectiveValue('skip', 'if', selection, variableValues) == true)
|
||||
if (getDirectiveValue('skip', 'if', selection, variableValues) == true) {
|
||||
continue;
|
||||
}
|
||||
if (getDirectiveValue('include', 'if', selection, variableValues) ==
|
||||
false) continue;
|
||||
false) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (selection.field != null) {
|
||||
var responseKey = selection.field.fieldName.alias?.alias ??
|
||||
|
@ -656,11 +658,9 @@ class GraphQL {
|
|||
if (visitedFragments.contains(fragmentSpreadName)) continue;
|
||||
visitedFragments.add(fragmentSpreadName);
|
||||
var fragment = document.definitions
|
||||
.where((d) => d is FragmentDefinitionContext)
|
||||
.firstWhere(
|
||||
(f) =>
|
||||
(f as FragmentDefinitionContext).name == fragmentSpreadName,
|
||||
orElse: () => null) as FragmentDefinitionContext;
|
||||
.whereType<FragmentDefinitionContext>()
|
||||
.firstWhere((f) => f.name == fragmentSpreadName,
|
||||
orElse: () => null);
|
||||
|
||||
if (fragment == null) continue;
|
||||
var fragmentType = fragment.typeCondition;
|
||||
|
@ -712,9 +712,10 @@ class GraphQL {
|
|||
if (vv.value != null) return vv.value.value;
|
||||
|
||||
var vname = vv.variable.name;
|
||||
if (!variableValues.containsKey(vname))
|
||||
if (!variableValues.containsKey(vname)) {
|
||||
throw GraphQLException.fromSourceSpan(
|
||||
'Unknown variable: "$vname"', vv.span);
|
||||
}
|
||||
|
||||
return variableValues[vname];
|
||||
}
|
||||
|
@ -723,8 +724,9 @@ class GraphQL {
|
|||
GraphQLObjectType objectType, TypeConditionContext fragmentType) {
|
||||
var type = convertType(TypeContext(fragmentType.typeName, null));
|
||||
if (type is GraphQLObjectType && !type.isInterface) {
|
||||
for (var field in type.fields)
|
||||
for (var field in type.fields) {
|
||||
if (!objectType.fields.any((f) => f.name == field.name)) return false;
|
||||
}
|
||||
return true;
|
||||
} else if (type is GraphQLObjectType && type.isInterface) {
|
||||
return objectType.isImplementationOf(type);
|
||||
|
|
|
@ -108,9 +108,9 @@ GraphQLObjectType _reflectSchemaTypes() {
|
|||
'ofType',
|
||||
_reflectSchemaTypes(),
|
||||
resolve: (type, _) {
|
||||
if (type is GraphQLListType)
|
||||
if (type is GraphQLListType) {
|
||||
return type.ofType;
|
||||
else if (type is GraphQLNonNullableType) return type.ofType;
|
||||
} else if (type is GraphQLNonNullableType) return type.ofType;
|
||||
return null;
|
||||
},
|
||||
),
|
||||
|
@ -213,22 +213,23 @@ GraphQLObjectType _createTypeType() {
|
|||
resolve: (type, _) {
|
||||
var t = type as GraphQLType;
|
||||
|
||||
if (t is GraphQLEnumType)
|
||||
if (t is GraphQLEnumType) {
|
||||
return 'ENUM';
|
||||
else if (t is GraphQLScalarType)
|
||||
} else if (t is GraphQLScalarType) {
|
||||
return 'SCALAR';
|
||||
else if (t is GraphQLInputObjectType)
|
||||
} else if (t is GraphQLInputObjectType) {
|
||||
return 'INPUT_OBJECT';
|
||||
else if (t is GraphQLObjectType)
|
||||
} else if (t is GraphQLObjectType) {
|
||||
return t.isInterface ? 'INTERFACE' : 'OBJECT';
|
||||
else if (t is GraphQLListType)
|
||||
} else if (t is GraphQLListType) {
|
||||
return 'LIST';
|
||||
else if (t is GraphQLNonNullableType)
|
||||
} else if (t is GraphQLNonNullableType) {
|
||||
return 'NON_NULL';
|
||||
else if (t is GraphQLUnionType)
|
||||
} else if (t is GraphQLUnionType) {
|
||||
return 'UNION';
|
||||
else
|
||||
} else {
|
||||
throw UnsupportedError('Cannot get the kind of $t.');
|
||||
}
|
||||
},
|
||||
),
|
||||
field(
|
||||
|
|
|
@ -7,10 +7,11 @@ import 'package:recase/recase.dart';
|
|||
/// Uses `dart:mirrors` to read field names from items. If they are Maps, performs a regular lookup.
|
||||
T mirrorsFieldResolver<T>(objectValue, String fieldName,
|
||||
[Map<String, dynamic> objectValues]) {
|
||||
if (objectValue is Map)
|
||||
if (objectValue is Map) {
|
||||
return objectValue[fieldName] as T;
|
||||
else
|
||||
} else {
|
||||
return reflect(objectValue).getField(Symbol(fieldName)).reflectee as T;
|
||||
}
|
||||
}
|
||||
|
||||
/// Reflects upon a given [type] and dynamically generates a [GraphQLType] that corresponds to it.
|
||||
|
|
|
@ -18,11 +18,12 @@ abstract class Server {
|
|||
if ((msg.type == OperationMessage.gqlConnectionInit) && !_init) {
|
||||
try {
|
||||
Map connectionParams;
|
||||
if (msg.payload is Map)
|
||||
if (msg.payload is Map) {
|
||||
connectionParams = msg.payload as Map;
|
||||
else if (msg.payload != null)
|
||||
} else if (msg.payload != null) {
|
||||
throw FormatException(
|
||||
'${msg.type} payload must be a map (object).');
|
||||
}
|
||||
|
||||
var connect = await onConnect(client, connectionParams);
|
||||
if (!connect) throw false;
|
||||
|
@ -39,33 +40,39 @@ abstract class Server {
|
|||
});
|
||||
}
|
||||
} catch (e) {
|
||||
if (e == false)
|
||||
if (e == false) {
|
||||
_reportError('The connection was rejected.');
|
||||
else
|
||||
} else {
|
||||
_reportError(e.toString());
|
||||
}
|
||||
}
|
||||
} else if (_init) {
|
||||
if (msg.type == OperationMessage.gqlStart) {
|
||||
if (msg.id == null)
|
||||
if (msg.id == null) {
|
||||
throw FormatException('${msg.type} id is required.');
|
||||
if (msg.payload == null)
|
||||
}
|
||||
if (msg.payload == null) {
|
||||
throw FormatException('${msg.type} payload is required.');
|
||||
else if (msg.payload is! Map)
|
||||
} else if (msg.payload is! Map) {
|
||||
throw FormatException(
|
||||
'${msg.type} payload must be a map (object).');
|
||||
}
|
||||
var payload = msg.payload as Map;
|
||||
var query = payload['query'];
|
||||
var variables = payload['variables'];
|
||||
var operationName = payload['operationName'];
|
||||
if (query == null || query is! String)
|
||||
if (query == null || query is! String) {
|
||||
throw FormatException(
|
||||
'${msg.type} payload must contain a string named "query".');
|
||||
if (variables != null && variables is! Map)
|
||||
}
|
||||
if (variables != null && variables is! Map) {
|
||||
throw FormatException(
|
||||
'${msg.type} payload\'s "variables" field must be a map (object).');
|
||||
if (operationName != null && operationName is! String)
|
||||
}
|
||||
if (operationName != null && operationName is! String) {
|
||||
throw FormatException(
|
||||
'${msg.type} payload\'s "operationName" field must be a string.');
|
||||
}
|
||||
var result = await onOperation(
|
||||
msg.id,
|
||||
query as String,
|
||||
|
|
|
@ -44,14 +44,15 @@ class OperationMessage {
|
|||
var payload = map['payload'];
|
||||
var id = map['id'];
|
||||
|
||||
if (type == null)
|
||||
if (type == null) {
|
||||
throw ArgumentError.notNull('type');
|
||||
else if (type is! String)
|
||||
} else if (type is! String) {
|
||||
throw ArgumentError.value(type, 'type', 'must be a string');
|
||||
else if (id is num)
|
||||
} else if (id is num) {
|
||||
id = id.toString();
|
||||
else if (id != null && id is! String)
|
||||
} else if (id != null && id is! String) {
|
||||
throw ArgumentError.value(id, 'id', 'must be a string or number');
|
||||
}
|
||||
|
||||
// TODO: This is technically a violation of the spec.
|
||||
// https://github.com/apollographql/subscriptions-transport-ws/issues/551
|
||||
|
|
|
@ -23,11 +23,11 @@ void main() {
|
|||
'todos',
|
||||
listOf(todoType),
|
||||
resolve: (_, __) => [
|
||||
Todo(
|
||||
text: 'Clean your room!',
|
||||
completed: false,
|
||||
)
|
||||
],
|
||||
Todo(
|
||||
text: 'Clean your room!',
|
||||
completed: false,
|
||||
)
|
||||
],
|
||||
),
|
||||
]),
|
||||
);
|
||||
|
|
Loading…
Reference in a new issue