From 77eb28f49c8787968427a1d360fd9700e91e1a3d Mon Sep 17 00:00:00 2001 From: Tobe O Date: Wed, 14 Aug 2019 00:48:18 -0400 Subject: [PATCH] Pedantic fixes --- graphql_server/example/main.dart | 10 +-- graphql_server/lib/graphql_server.dart | 74 ++++++++++---------- graphql_server/lib/introspection.dart | 21 +++--- graphql_server/lib/mirrors.dart | 5 +- graphql_server/lib/src/apollo/server.dart | 27 ++++--- graphql_server/lib/src/apollo/transport.dart | 9 +-- graphql_server/test/query_test.dart | 10 +-- 7 files changed, 84 insertions(+), 72 deletions(-) diff --git a/graphql_server/example/main.dart b/graphql_server/example/main.dart index 6cf07e9e..335fe284 100644 --- a/graphql_server/example/main.dart +++ b/graphql_server/example/main.dart @@ -23,11 +23,11 @@ void main() { 'todos', listOf(todoType), resolve: (_, __) => [ - Todo( - text: 'Clean your room!', - completed: false, - ) - ], + Todo( + text: 'Clean your room!', + completed: false, + ) + ], ), ]), ); diff --git a/graphql_server/lib/graphql_server.dart b/graphql_server/lib/graphql_server.dart index f24c8f02..796422af 100644 --- a/graphql_server/lib/graphql_server.dart +++ b/graphql_server/lib/graphql_server.dart @@ -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 ?? {}); - 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(); 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 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> executeSelectionSet( @@ -348,8 +350,7 @@ class GraphQL { objectValue, fields, fieldType, - Map.from( - globalVariables ?? {}) + Map.from(globalVariables ?? {}) ..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() + .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); diff --git a/graphql_server/lib/introspection.dart b/graphql_server/lib/introspection.dart index ad07bd43..8ccd68da 100644 --- a/graphql_server/lib/introspection.dart +++ b/graphql_server/lib/introspection.dart @@ -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( diff --git a/graphql_server/lib/mirrors.dart b/graphql_server/lib/mirrors.dart index 35149790..c69589e1 100644 --- a/graphql_server/lib/mirrors.dart +++ b/graphql_server/lib/mirrors.dart @@ -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(objectValue, String fieldName, [Map 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. diff --git a/graphql_server/lib/src/apollo/server.dart b/graphql_server/lib/src/apollo/server.dart index 0a1de4a4..6a16f917 100644 --- a/graphql_server/lib/src/apollo/server.dart +++ b/graphql_server/lib/src/apollo/server.dart @@ -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, diff --git a/graphql_server/lib/src/apollo/transport.dart b/graphql_server/lib/src/apollo/transport.dart index 7eab13fc..dac18d65 100644 --- a/graphql_server/lib/src/apollo/transport.dart +++ b/graphql_server/lib/src/apollo/transport.dart @@ -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 diff --git a/graphql_server/test/query_test.dart b/graphql_server/test/query_test.dart index 6cf07e9e..335fe284 100644 --- a/graphql_server/test/query_test.dart +++ b/graphql_server/test/query_test.dart @@ -23,11 +23,11 @@ void main() { 'todos', listOf(todoType), resolve: (_, __) => [ - Todo( - text: 'Clean your room!', - completed: false, - ) - ], + Todo( + text: 'Clean your room!', + completed: false, + ) + ], ), ]), );